function AttributeRouteDiscovery::collectRoutes

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/Routing/AttributeRouteDiscovery.php \Drupal\Core\Routing\AttributeRouteDiscovery::collectRoutes()

Creates a collection of routes to add to the route builder.

Return value

iterable<int, \Symfony\Component\Routing\RouteCollection> The routes.

Overrides StaticRouteDiscoveryBase::collectRoutes

File

core/lib/Drupal/Core/Routing/AttributeRouteDiscovery.php, line 40

Class

AttributeRouteDiscovery
Discovers routes using Symfony's Route attribute.

Namespace

Drupal\Core\Routing

Code

protected function collectRoutes() : iterable {
  $routeTypes = [
    'Controller' => $this->createControllerRouteCollection(...),
    'Form' => $this->createFormRouteCollection(...),
  ];
  foreach ($this->namespaces as $namespace => $directories) {
    foreach ((array) $directories as $directory) {
      foreach ($routeTypes as $routeType => $factory) {
        $routeDirectory = $directory . '/' . $routeType;
        $routeNamespace = $namespace . '\\' . $routeType;
        if (is_dir($routeDirectory)) {
          $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($routeDirectory, \RecursiveDirectoryIterator::SKIP_DOTS));
          foreach ($iterator as $fileinfo) {
            if ($fileinfo->getExtension() == 'php') {
              // Skip files that do not contain a Route attribute.
              $contents = file_get_contents($fileinfo->getPathname());
              if (!str_contains($contents, '#[Route') && !str_contains($contents, 'Routing\\Attribute\\Route')) {
                continue;
              }
              $subPath = $iterator->getSubIterator()
                ->getSubPath();
              $subPath = $subPath ? str_replace(DIRECTORY_SEPARATOR, '\\', $subPath) . '\\' : '';
              $class = $routeNamespace . '\\' . $subPath . $fileinfo->getBasename('.php');
              $reflectionClass = $this->getReflectionClass($class);
              if ($reflectionClass !== NULL) {
                yield $factory($reflectionClass);
              }
            }
          }
        }
      }
    }
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.