@@ -26,52 +26,80 @@ final class LoadDiscoveryClasses
2626 private array $ shouldSkipForClass = [];
2727
2828 public function __construct (
29- private readonly Kernel $ kernel ,
3029 private readonly Container $ container ,
3130 private readonly DiscoveryConfig $ discoveryConfig ,
3231 private readonly DiscoveryCache $ discoveryCache ,
3332 ) {}
3433
35- public function __invoke (): void
36- {
37- $ discoveries = $ this ->build ();
34+ /**
35+ * @param class-string<Discovery>[]|null $discoveryClasses
36+ * @param DiscoveryLocation[]|null $discoveryLocations
37+ */
38+ public function __invoke (
39+ ?array $ discoveryClasses = null ,
40+ ?array $ discoveryLocations = null ,
41+ ): void {
42+ $ discoveries = $ this ->build ($ discoveryClasses , $ discoveryLocations );
3843
3944 foreach ($ discoveries as $ discovery ) {
4045 $ this ->applyDiscovery ($ discovery );
4146 }
4247 }
4348
44- /** @return Discovery[] */
45- public function build (): array
46- {
47- // DiscoveryDiscovery needs to be applied before we can build all other discoveries
48- $ discoveryDiscovery = $ this ->resolveDiscovery (DiscoveryDiscovery::class);
49+ /**
50+ * @param class-string<Discovery>[]|null $discoveryClasses
51+ * @param DiscoveryLocation[]|null $discoveryLocations
52+ * @return Discovery[]
53+ */
54+ public function build (
55+ ?array $ discoveryClasses = null ,
56+ ?array $ discoveryLocations = null ,
57+ ): array {
58+ $ kernel = $ this ->container ->get (Kernel::class);
4959
50- // The first pass over all directories to find all discovery classes
51- $ this ->discover ([$ discoveryDiscovery ]);
60+ $ discoveryLocations ??= $ kernel ->discoveryLocations ;
5261
53- // Manually apply DiscoveryDiscovery
54- $ this ->applyDiscovery ($ discoveryDiscovery );
62+ if ($ discoveryClasses === null ) {
63+ // DiscoveryDiscovery needs to be applied before we can build all other discoveries
64+ $ discoveryDiscovery = $ this ->resolveDiscovery (DiscoveryDiscovery::class);
5565
56- // Resolve all other discoveries from the container, optionally loading their cache
57- $ discoveries = array_map (
58- fn (string $ discoveryClass ) => $ this ->resolveDiscovery ($ discoveryClass ),
59- $ this ->kernel ->discoveryClasses ,
60- );
66+ // The first pass over all directories to find all discovery classes
67+ $ this ->discover ([$ discoveryDiscovery ], $ discoveryLocations );
6168
62- // The second pass over all directories to apply all other discovery classes
63- $ this ->discover ( $ discoveries );
69+ // Manually apply DiscoveryDiscovery
70+ $ this ->applyDiscovery ( $ discoveryDiscovery );
6471
65- return [$ discoveryDiscovery , ...$ discoveries ];
72+ // Resolve all other discoveries from the container, optionally loading their cache
73+ $ discoveries = array_map (
74+ fn (string $ discoveryClass ) => $ this ->resolveDiscovery ($ discoveryClass ),
75+ $ kernel ->discoveryClasses ,
76+ );
77+
78+ // The second pass over all directories to apply all other discovery classes
79+ $ this ->discover ($ discoveries , $ discoveryLocations );
80+
81+ return [$ discoveryDiscovery , ...$ discoveries ];
82+ } else {
83+ // Resolve all manually specified discoveries
84+ $ discoveries = array_map (
85+ fn (string $ discoveryClass ) => $ this ->resolveDiscovery ($ discoveryClass ),
86+ $ discoveryClasses ,
87+ );
88+
89+ $ this ->discover ($ discoveries , $ discoveryLocations );
90+
91+ return $ discoveries ;
92+ }
6693 }
6794
6895 /**
6996 * Build a list of discovery classes within all registered discovery locations
7097 * @param Discovery[] $discoveries
98+ * @param DiscoveryLocation[]|null $discoveryLocations
7199 */
72- private function discover (array $ discoveries ): void
100+ private function discover (array $ discoveries, array $ discoveryLocations ): void
73101 {
74- foreach ($ this -> kernel -> discoveryLocations as $ location ) {
102+ foreach ($ discoveryLocations as $ location ) {
75103 // Skip location based on cache status
76104 if ($ this ->isLocationCached ($ location )) {
77105 $ cachedForLocation = $ this ->discoveryCache ->restore ($ location );
@@ -258,7 +286,7 @@ private function shouldSkipDiscoveryForClass(Discovery $discovery, ClassReflecto
258286 return true ;
259287 }
260288
261- // Current discovery was present in the except array, so it shouldn't be skipped
289+ // Current discovery was present in the excepted array, so it shouldn't be skipped
262290 return false ;
263291 }
264292
0 commit comments