function AttributeRouteDiscoveryTest::testOnRouteBuild
Same name and namespace in other branches
- 11.x core/tests/Drupal/Tests/Core/Routing/AttributeRouteDiscoveryTest.php \Drupal\Tests\Core\Routing\AttributeRouteDiscoveryTest::testOnRouteBuild()
@legacy-covers ::onRouteBuild
File
-
core/
tests/ Drupal/ Tests/ Core/ Routing/ AttributeRouteDiscoveryTest.php, line 72
Class
Namespace
Drupal\Tests\Core\RoutingCode
public function testOnRouteBuild() : void {
$this->assertNotEmpty($this->routeCollection);
$route1 = $this->routeCollection
->get('router_test.method_attribute');
$this->assertNotNull($route1);
$this->assertSame('/test_method_attribute', $route1->getPath());
$this->assertSame(TestAttributes::class . '::attributeMethod', $route1->getDefault('_controller'));
$this->assertSame("TRUE", $route1->getRequirement('_access'));
$this->assertSame($route1, $this->routeCollection
->get('router_test.alias_test'));
$route2 = $this->routeCollection
->get('router_test.class_invoke');
$this->assertNotNull($route2);
$this->assertSame('/test_class_attribute', $route2->getPath());
$this->assertSame(TestClassAttribute::class, $route2->getDefault('_controller'));
$this->assertSame("TRUE", $route2->getRequirement('_access'));
$this->assertSame($route2, $this->routeCollection
->get(TestClassAttribute::class . '::__invoke'));
$route3 = $this->routeCollection
->get('router_test.method_attribute_other');
$this->assertNotNull($route3);
$this->assertSame('/test_method_attribute-other-path', $route3->getPath());
$this->assertSame(TestAttributes::class . '::attributeMethod', $route3->getDefault('_controller'));
$this->assertSame("TRUE", $route3->getRequirement('_access'));
$formRoute = $this->routeCollection
->get('router_test.form_route');
$this->assertNotNull($formRoute);
$this->assertSame('/test-form-route', $formRoute->getPath());
$this->assertSame(TestRouteAttributeForm::class, $formRoute->getDefault('_form'));
$this->assertSame('router_test.form_route', $this->routeCollection
->getAlias(TestRouteAttributeForm::class)
->getId());
$this->assertNull($this->routeCollection
->get('router_test.invalid_controller_route'));
// Since Route attributes on form class methods are not supported, add a
// virtual form class that has a Route attribute on a method to confirm
// there that there is an AssertionError thrown.
vfsStream::setup('router_test_invalid');
vfsStream::create([
'src' => [
'Form' => [
'TestRouteInvalidAttributeForm.php' => '',
],
],
]);
file_put_contents('vfs://router_test_invalid/src/Form/TestRouteInvalidAttributeForm.php', <<<'EOF'
<?php
declare(strict_types=1);
namespace Drupal\router_test_invalid\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\Routing\Attribute\Route;
class TestRouteInvalidAttributeForm extends FormBase {
public function getFormId(): string {
return 'invalid_router_test';
}
public function buildForm(array $form, FormStateInterface $form_state): array {
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state): void {
}
#[Route(
path: '/invalid-form-method-route',
name: 'router_test.invalid_form_method_route',
)]
public function invalidFormMethodRoute(): array {
return [];
}
}
EOF);
$event = new RouteBuildEvent(new RouteCollection());
$namespaces = new \ArrayObject([
'Drupal\\router_test_invalid' => vfsStream::url('router_test_invalid/src'),
]);
$additionalClassLoader = new ClassLoader();
$additionalClassLoader->addPsr4("Drupal\\router_test_invalid\\", vfsStream::url('router_test_invalid/src'));
$additionalClassLoader->register(TRUE);
$discovery = new AttributeRouteDiscovery($namespaces);
$this->expectException(\AssertionError::class);
$this->expectExceptionMessage('Route attributes can not target methods on class Drupal\\router_test_invalid\\Form\\TestRouteInvalidAttributeForm. Use the attribute on the form class itself.');
$discovery->onRouteBuild($event);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.