Lines
96.15%
25 / 26
Methods
75.00%
3 / 4
Classes
0.00%
0 / 1
| Name | Lines | Methods | CRAP | ||||
|---|---|---|---|---|---|---|---|
| __construct | 100.00% | 1 / 1 | 100.00% | 1 / 1 | 1 | ||
| build | 100.00% | 1 / 1 | 100.00% | 1 / 1 | 1 | ||
| loadAttributeRoutes | 87.50% | 7 / 8 | 0.00% | 0 / 1 | 3.02 | ||
| getControllerDirectories | 100.00% | 16 / 16 | 100.00% | 1 / 1 | 6 | ||
| 31 | class RouteCollectionBuilder | |
| 32 | { | |
| 33 | private AttributeRouteLoader $attributeLoader; | |
| 34 | ||
| 35 | public function __construct( | |
| 36 | private readonly ?Configuration $configuration = null, | |
| 37 | ) { | |
| 38 | $this->attributeLoader = new AttributeRouteLoader(); | |
| 39 | } | |
| 40 | ||
| 41 | /** | |
| 42 | * Build a RouteCollection for the specified context. | |
| 43 | * | |
| 44 | * @param string $context The routing context ('public', 'admin', 'admin-api', 'api') | |
| 45 | * @param bool $attributesOnly Deprecated parameter kept for backward compatibility (always true now) | |
| 46 | * @return RouteCollection The route collection loaded from controller attributes | |
| 47 | */ | |
| 48 | public function build(string $context, bool $attributesOnly = true): RouteCollection | |
| 49 | { | |
| 50 | // Load routes from controller attributes | |
| 51 | return $this->loadAttributeRoutes($context); | |
| 52 | } | |
| 53 | ||
| 54 | /** | |
| 55 | * Load routes from controller attributes. | |
| 56 | * | |
| 57 | * @param string $context The routing context | |
| 58 | * @return RouteCollection The attribute-based routes | |
| 59 | */ | |
| 60 | private function loadAttributeRoutes(string $context): RouteCollection | |
| 61 | { | |
| 62 | $controllerDirs = $this->getControllerDirectories($context); | |
| 63 | $routes = new RouteCollection(); | |
| 64 | ||
| 65 | foreach ($controllerDirs as $dir) { | |
| 66 | if (!is_dir($dir)) { | |
| 67 | continue; | |
| 68 | } | |
| 69 | ||
| 70 | $dirRoutes = $this->attributeLoader->load($dir, $context); | |
| 71 | $routes->addCollection($dirRoutes); | |
| 72 | } | |
| 73 | ||
| 74 | return $routes; | |
| 75 | } | |
| 76 | ||
| 77 | /** | |
| 78 | * Get controller directories for the specified context. | |
| 79 | * | |
| 80 | * @param string $context The routing context | |
| 81 | * @return array<string> Array of controller directory paths | |
| 82 | */ | |
| 83 | private function getControllerDirectories(string $context): array | |
| 84 | { | |
| 85 | $baseDir = PMF_SRC_DIR . '/phpMyFAQ/Controller'; | |
| 86 | ||
| 87 | return match ($context) { | |
| 88 | 'public' => [ | |
| 89 | $baseDir . '/Frontend', | |
| 90 | ], | |
| 91 | 'admin' => [ | |
| 92 | $baseDir . '/Administration', | |
| 93 | ], | |
| 94 | 'admin-api' => [ | |
| 95 | $baseDir . '/Administration/Api', | |
| 96 | ], | |
| 97 | 'api' => [ | |
| 98 | $baseDir . '/Api', | |
| 99 | $baseDir . '/Frontend/Api', | |
| 100 | ], | |
| 101 | default => [$baseDir], | |
| 102 | }; | |
| 103 | } | |
| 104 | } |