Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork9.7k
[Routing] PSR-4 directory loader#47916
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
Uh oh!
There was an error while loading.Please reload this page.
nicolas-grekas left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Nice one!
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
83ee61d to3d0f3cbComparederrabus commentedOct 19, 2022
If we accept this feature, we can consider deprecating |
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
3a37b7f tod5552b8CompareUh oh!
There was an error while loading.Please reload this page.
d5552b8 toc3aef36Comparesrc/Symfony/Bundle/FrameworkBundle/Tests/Functional/Psr4RoutingTest.php OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
c3aef36 to11a55adCompare3a02ca9 tobeca77dComparederrabus commentedOct 19, 2022
Recipe:symfony/recipes#1136 |
fancyweb commentedOct 19, 2022
Could we make the namespace root part ( |
derrabus commentedOct 19, 2022
The |
Uh oh!
There was an error while loading.Please reload this page.
...ymfony/Component/Routing/Tests/Fixtures/Psr4Controllers/SubNamespace/IrrelevantInterface.php OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
derrabus commentedOct 19, 2022
nicolas-grekas commentedOct 19, 2022
What about replacing |
derrabus commentedOct 19, 2022
It would be more consistent with the other loaders, yes. Let's try that. This way, the namespace would in fact become optional because if you omit it, the old |
046ef87 toa31b27dComparederrabus commentedOct 19, 2022
Done. I like the change. I'll update the recipe and the docs right away. |
derrabus commentedOct 19, 2022
Should I rename |
nicolas-grekas commentedOct 19, 2022
Nah, not needed IMHO. |
a31b27d to158e30dComparefabpot commentedOct 20, 2022
Thank you@derrabus. |
…loading (derrabus)This PR was merged into the 6.2 branch.Discussion----------[Config][Routing] Nicer config syntax for PSR-4 route loading| Q | A| ------------- | ---| Branch? | 6.2| Bug fix? | no| New feature? | yes| Deprecations? | no| Tickets | Follow-up to#47916| License | MIT| Doc PR |symfony/symfony-docs#17373 (WIP)This PR implements an alternative syntax for the PSR-4 route loader introduced in#47916.```YAMLcontrollers: resource: path: ./Controllers namespace: App\Controllers type: attribute``````XML<routes> <import type="attribute"> <resource path="./Controllers" namespace="App\Psr4Controllers" /> </import></routes>```Commits-------d7df3be Nicer config syntax for PSR-4 route loading
This PR was merged into the 6.2 branch.Discussion----------Document the PSR-4 route loaderThis PR documentssymfony/symfony#47916Although the PR does not deprecate `AnnotationDirectoryLoader` and `AnnotationFileLoader`, I chose to recommend only the new `Psr4DirectoryLoader` and `AnnotationDirectoryLoader` in `routing.rst`. In `routing/custom_route_loader.rst`, all four loaders are listed for completeness.Using a class name as resource instead of a file path has always worked, but wasn't documented for some reason. I have added examples for that as well.Commits-------ac2f793 Document the PSR-4 route loader
…iles (derrabus)This PR was merged into the 6.2 branch.Discussion----------[Routing] Add tests for loading PSR-4 classes from PHP files| Q | A| ------------- | ---| Branch? | 6.2| Bug fix? | no| New feature? | no| Deprecations? | no| Tickets | N/A| License | MIT| Doc PR | N/AFollow-up to#47916,#47943This PR adds more tests, demonstrating how to trigger the new PSR-4 loader from a PHP config file.Commits-------416639c Add tests for loading PSR-4 classes from PHP files
Tobion commentedNov 9, 2022
I think it makes sense. The AnnotationFileLoader seems to assume the class is autoloadable anyway (it does not include the file manually). So it basically requires an autoloading config anyway which is very likely psr-4. Btw, wouldn't it be usefull if composer offered an API to query what namespace is expected in a directory (and the other way round). Then we could re-use the information composer already has. |
Uh oh!
There was an error while loading.Please reload this page.
This PR adds a PSR-4 directory loader to the Routing component.
When we currently want to load routes from a directory with controllers, we configure it like this:
What happens now is that
AnnotationDirectoryLoadersearches that directory recursively for*.phpfiles and uses PHP's tokenizer extension to discover all controller classes that are defined within that directory. This step feels unnecessarily expensive given that modern projects follow the PSR-4 standard to structure their code. And if we use the DI component's autodiscovery feature to register our controllers as services, our controller directory already has to follow PSR-4.A client I'm working with adds the additional challange that they deliver their code to their customers in encrypted form (using SourceGuardian). This means that the PHP files contain encrypted bytecode instead of plain PHP and thus cannot be parsed. We currently overcome this limitation by extending
AnnotationDirectoryLoaderand overriding the protectedfindClass()method.This PR proposes to extend the resource type
attributeand allow to suffix it with a PSR-4 namespace root.In order to use PSR-4 to discover controller classes, the directory path is not enough. We always need an additional piece of information which is the namespace root for the given directory. Without changing large parts of the Config component, I did not find a nice way to pass down that information to the PSR-4 route loader. Encoding that information into the
typeparameter seemed like the pragmatic approach, but I'm open to discussing alternatives.This approach should play nicely with projects that already use attributes for routing and PSR-4 autodiscovery to register controllers as services. In fact, most project should be able to swap the
type: annotationortype: attributeconfig withtype: attribute@Your\Namespace\Hereand the only difference they notice is that router compilation becomes a bit faster.