-
-
Notifications
You must be signed in to change notification settings - Fork 448
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 our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
adds lazy-loading event manager, improved listener registration #23
Conversation
adds lazy-loading event manager, improved listener registration
foreach ($container->findTaggedServiceIds('doctrine.event_subscriber') as $subscriberId => $instances) { | ||
$this->registerSubscriber($subscriberId, $instances); | ||
} | ||
return $a > $b ? -1 : 1; |
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.
what about the case where priorities are the same ?
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.
Academically speaking, the sorting algorithm is stable.
the lazy manager should also be tested |
I'm in the process of porting this over to the MongoDB bundle. LazyLoadingEventManager looks like a good candidate for the Symfony Bridge. Thoughts? |
indeed, there's nothing specific to the ORM in it. feel free to submit a PR to the bridge with it |
Does it also make sense to move at least parts of the compiler pass? It should look similar for ODMs, no? |
@schmittjoh it depends if the ODM guys agree to break BC regarding the listener tags they use. They never ported the refactoring done by Fabien in DoctrineBundle during the beta cycle (to use a |
I was planning on copying the compiler pass as well for the bundle. In addition to letting listeners focus on just one connection, you implemented priorities as well. Furthermore, I think having one event manager per connection is a great idea. It keeps the service definitions organized better and doesn't lead to ambiguity when we have event managers for both connections and DM's. There is no prior art for putting a compiler pass in a bridge, so I'm unsure how best to organize that. |
@jwage: What's your take on breaking BC on DoctrineMongoDBBundle's listener tags to make it more consistent with ORM? I believe the tag name changes, but we gain attributes for |
@jmikola in fact, there is already a compiler pass in the doctrine bridge :) |
You are correct, sir. I totally missed DoctrineValidationPass. |
Commits ------- 71493a2 [DoctrineBridge] Compiler pass for registering event listeners/subscribers f15dde6 [DoctrineBridge] ContainerAwareEventManager class Discussion ---------- [DoctrineBridge] ContainerAwareEventManager class ``` Bug fix: no Feature addition: yes Backwards compatibility break: no Symfony2 tests pass: yes Fixes the following tickets: - Todo: - ``` [![Build Status](https://secure.travis-ci.org/jmikola/symfony.png?branch=doctrine-lazy-event-manager)](http://travis-ci.org/jmikola/symfony) This allows services to be registered (and lazily loaded) with Doctrine Common's EventManager. It is ported from @schmittjoh's previous commits here: doctrine/DoctrineBundle#23. I'd like to integrate this with DoctrineMongoDBBundle, so the Bridge once again seemed like an ideal alternative to duplicating code. --------------------------------------------------------------------------- by jmikola at 2012-02-23T20:37:51Z Per conversation with @stof in doctrine/DoctrineBundle#23, I'm also going to integrate the compiler pass (an abstract version both bundles can use) into this PR. --------------------------------------------------------------------------- by jmikola at 2012-02-23T21:56:47Z Just realized there's an issue with the naming assumptions, since Doctrine ORM uses "doctrine" as its registry service ID but "doctrine.dbal" as its event manager prefix. Fixing.
Commits ------- 71493a2 [DoctrineBridge] Compiler pass for registering event listeners/subscribers f15dde6 [DoctrineBridge] ContainerAwareEventManager class Discussion ---------- [DoctrineBridge] ContainerAwareEventManager class ``` Bug fix: no Feature addition: yes Backwards compatibility break: no Symfony2 tests pass: yes Fixes the following tickets: - Todo: - ``` [![Build Status](https://secure.travis-ci.org/jmikola/symfony.png?branch=doctrine-lazy-event-manager)](http://travis-ci.org/jmikola/symfony) This allows services to be registered (and lazily loaded) with Doctrine Common's EventManager. It is ported from @schmittjoh's previous commits here: doctrine/DoctrineBundle#23. I'd like to integrate this with DoctrineMongoDBBundle, so the Bridge once again seemed like an ideal alternative to duplicating code. --------------------------------------------------------------------------- by jmikola at 2012-02-23T20:37:51Z Per conversation with @stof in doctrine/DoctrineBundle#23, I'm also going to integrate the compiler pass (an abstract version both bundles can use) into this PR. --------------------------------------------------------------------------- by jmikola at 2012-02-23T21:56:47Z Just realized there's an issue with the naming assumptions, since Doctrine ORM uses "doctrine" as its registry service ID but "doctrine.dbal" as its event manager prefix. Fixing.
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
Otherwise we get ``` Uncaught Exception: InvalidArgumentException Could not get class storage for doctrine\common\collections\selectable Emitted in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45 Stack trace in the forked worker: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes() #8 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes() #9 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve() #10 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start() #11 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode() #12 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #13 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #14 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray() #15 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode() #16 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray() #17 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse() #18 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan() #19 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile() #20 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(191): Psalm\Internal\Codebase\Scanner->scanAPath() #21 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(332): Psalm\Internal\Fork\Pool->__construct() #22 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #23 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #24 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #25 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #26 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #27 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #28 {main} in /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php:379 Stack trace: #0 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Fork/Pool.php(413): Psalm\Internal\Fork\Pool->readResultsFromChildren() #1 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(384): Psalm\Internal\Fork\Pool->wait() #2 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths() #3 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles() #4 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(510): Psalm\Codebase->scanFiles() #5 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check() #6 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run() #7 /home/runner/work/DoctrineBundle/DoctrineBundle/vendor/bin/psalm(119): include('...') #8 {main} (Psalm 5.22.1@e9dad66e11274315dac27e08349c628c7d6a1a43 crashed due to an uncaught Throwable) ```
The lazy-loading event manager implementation is mainly targeted at removing the overhead of schema creation listener which are not needed on each request.
The improved listener pass also allows you to make the order of listener independent of the order in which bundles are registered.