Comments (5)
Solving your problem needs either ignoring files which use not autoloadable classes by configuration on your side or using static reflection and ignoring incomplete classes on Nette side.
Registering class as a service because some service relies on it is unreliable. It could work, but only with non-abstract classes. Even requiring interface instead of its implementation would break that magic. Context-specific dependencies like ORM entities would probably pass automatic registration, but who wants entities registered as services?
Btw, RobotLoader in SearchExtension is used just to find classes in a folder, not for actual autoloading. Problem is on php level - loading php files requires php to resolve references (e.g. extending phpunit test case), which triggers all autoloaders (composer in your case) and fails on missing class. That's why static reflection would be needed if solved on Nette side.
from di.
Solving your problem needs either ignoring files which use not autoloadable classes by configuration on your side
The search extension does not really allow ignoring files:
[exclude
](di/src/DI/Extensions/SearchExtension.php
Line 108 in 1b2d371
- the extension only really allows controlling the
acceptFiles
parameter ofRobotLoader
, which does not allow negative globs as far as I can tell.
Registering class as a service because some service relies on it is unreliable. It could work, but only with non-abstract classes. Even requiring interface instead of its implementation would break that magic.
Good point, but I would expect most of abstract classes/interfaces will have more than one implementation and then the SearchExtension
would fail just as well.
Context-specific dependencies like ORM entities would probably pass automatic registration, but who wants entities registered as services?
Right, but again I am interested in this specifically as an opposition to SearchExtension
which will have the exact same downside if you pass src/
to it without any excludes.
Btw, RobotLoader in SearchExtension is used just to find classes in a folder, not for actual autoloading.
Yes, I am aware, which is why I specifically tried to talk about registration, not loading.
The extension I propose would just replace the in-advance file system search with looking at dependencies of explicitly registered services (transitively). And instead of file system path prefix, it would be limited by PHP namespace prefix.
Problem is on php level - loading php files requires php to resolve references (e.g. extending phpunit test case), which triggers all autoloaders (composer in your case) and fails on missing class. That's why static reflection would be needed if solved on Nette side.
I am not really sure if this is something Nette should be expected to solve. After all, having a Nette app and a library with optional dependencies in the same src/
directory is pretty unorthodox.
But either way, it is orthogonal to this proposal. Here I am mostly interested in getting rid of RobotLoader
since I do not find it very useful.
Another benefit to this would be that it would make the container smaller than the equivalent use of SearchExtension
, unless one is meticulous about excluding every class they do not need – but then you might as well register just the classes you need manually. Automatic registration of dependency classes in a certain namespace would only register actual dependencies.
from di.
I will add to SearchExtension the option to exclude files as well, I thought it was there a long time ago.
The latter is based on RobotLoader, which, in addition to repeating the work already done by Composer in most modern projects, can cause issues when some of the classes are not loadable.
That's not true. Composer's role and capability is not to provide a list of all classes in an application.
from di.
Composer's role and capability is not to provide a list of all classes in an application.
Yes, but I would argue most apps will know the list of classes statically so getting a list of classes only matters in two cases (AFAICT):
- A class takes an abstract class/interface as a dependency.
- But unless there is only a single implementation, the mapping would still need to be resolved manually, thus the class name would be also known statically.
- App supports installing extensions at run time by copying them into a subdirectory.
from di.
But unless there is only a single implementation, the mapping would still need to be resolved manually, thus the class name would be also known statically.
And how are you going to find out that there is only one implementation and what is its class name without a list of all the classes?
from di.
Related Issues (20)
- Injecting the Container into the service should generate a notice HOT 2
- CompilerExtension should contain mustBeDefinedBefore() and mustBeDefinedAfter() for extensions position
- Call to an undefined method Nette\DI\Definitions\Definition::setFactory(). HOT 3
- Unable to pass underscore as argument HOT 1
- Named parameter $refUrl used at the same time as a positional in LinkGenerator::__construct().
- Extension - default config value is empty string
- nette.configurator/Container_2f7bddb5fb.php.meta: Failed to open stream: No such file or directory HOT 8
- Required but nullable arguments should be required to be specified in the config HOT 4
- Serialization of Closure is not allowed Exception thrown when using new in constructor (PHP 8.1 feature) HOT 1
- Invalid type 'Nette\DI\?T' when accessing `Container#getByType()` from DI config HOT 23
- Error in Nete\DI\Resolver.php at branch v.3.1 HOT 1
- Generated multi accessor does not support only one service
- Service constructor: add native support for strict array type. HOT 4
- Service inject initiator
- Tracy panel for DI is too slow HOT 1
- DI not accepting null value of Nette config parameter if parameter is Object HOT 5
- Arguments are not unpacked when creating instance in DI extension HOT 1
- Decorators not called HOT 6
- Concatenate static parameter with string ends with exception HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from di.