#[Attribute]
class Route {
public function __construct(
public string $path,
public string $method = 'GET',
) {}
}
#[Route('/users', 'GET')]
#[Middleware(AuthMiddleware::class)]
class UserController {
#[Route('/users/{id}')]
public function show(int $id): Response { ... }
}
$ref = new ReflectionClass(UserController::class);
$attrs = $ref->getAttributes(Route::class);
foreach ($attrs as $attr) {
$route = $attr->newInstance(); // Route('/users', 'GET')
}
DI containers, routers, ORM mapping, validators, serialisers. Symfony and Doctrine use attributes extensively instead of XML/YAML configuration.