Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AttributeClassLoader.php

function AttributeClassLoader::load

Throws

\InvalidArgumentException When route can't be parsed

File

vendor/symfony/routing/Loader/AttributeClassLoader.php, line 92

Class

AttributeClassLoader
AttributeClassLoader loads routing information from a PHP class and its methods.

Namespace

Symfony\Component\Routing\Loader

Code

public function load(mixed $class, ?string $type = null) : RouteCollection {
    if (!class_exists($class)) {
        throw new \InvalidArgumentException(\sprintf('Class "%s" does not exist.', $class));
    }
    $class = new \ReflectionClass($class);
    if ($class->isAbstract()) {
        throw new \InvalidArgumentException(\sprintf('Attributes from class "%s" cannot be read as it is abstract.', $class->getName()));
    }
    $globals = $this->getGlobals($class);
    $collection = new RouteCollection();
    $collection->addResource(new FileResource($class->getFileName()));
    if ($globals['env'] && $this->env !== $globals['env']) {
        return $collection;
    }
    $fqcnAlias = false;
    foreach ($class->getMethods() as $method) {
        $this->defaultRouteIndex = 0;
        $routeNamesBefore = array_keys($collection->all());
        foreach ($this->getAttributes($method) as $attr) {
            $this->addRoute($collection, $attr, $globals, $class, $method);
            if ('__invoke' === $method->name) {
                $fqcnAlias = true;
            }
        }
        if (1 === $collection->count() - \count($routeNamesBefore)) {
            $newRouteName = current(array_diff(array_keys($collection->all()), $routeNamesBefore));
            if ($newRouteName !== ($aliasName = \sprintf('%s::%s', $class->name, $method->name))) {
                $collection->addAlias($aliasName, $newRouteName);
            }
        }
    }
    if (0 === $collection->count() && $class->hasMethod('__invoke')) {
        $globals = $this->resetGlobals();
        foreach ($this->getAttributes($class) as $attr) {
            $this->addRoute($collection, $attr, $globals, $class, $class->getMethod('__invoke'));
            $fqcnAlias = true;
        }
    }
    if ($fqcnAlias && 1 === $collection->count()) {
        $invokeRouteName = key($collection->all());
        if ($invokeRouteName !== $class->name) {
            $collection->addAlias($class->name, $invokeRouteName);
        }
        if ($invokeRouteName !== ($aliasName = \sprintf('%s::__invoke', $class->name))) {
            $collection->addAlias($aliasName, $invokeRouteName);
        }
    }
    return $collection;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal