App\Routing
Router
Zentraler HTTP-Router mit Middleware-Pipeline, Gruppen-Routing und URL-Generierung. Unterstützt Controller-Klassen, Closures und PHP-Attribute für die Routendefinition.
Schnellstart
PHP – Grundlegende Routen
use App\Routing\Router;
use App\Controller\UserController;
$router = new Router();
// Controller-Methode
$router->get('/users', UserController::class, 'index');
$router->post('/users', UserController::class, 'store');
$router->get('/users/{id}', UserController::class, 'show');
$router->put('/users/{id}', UserController::class, 'update');
$router->delete('/users/{id}', UserController::class, 'destroy');
// Closure
$router->get('/health', fn($req) => Response::json(['status' => 'ok']));
// Route dispatchen
$response = $router->dispatch();
$response->send();
Methoden
| Methode | Rückgabetyp | Beschreibung |
|---|---|---|
| get(string $path, Closure|string $controller, ?string $action) | RouteBuilder | Registriert eine GET-Route. Gibt einen RouteBuilder für weitere Konfiguration zurück. |
| post(…) | RouteBuilder | Registriert eine POST-Route. |
| put(…) / patch(…) / delete(…) / options(…) | RouteBuilder | Registriert Routen für die jeweilige HTTP-Methode. |
| match(array $methods, string $path, …) | void | Registriert eine Route für mehrere HTTP-Methoden gleichzeitig. Gibt kein RouteBuilder zurück. |
| group(string $prefix, array $middleware, Closure $callback) | void | Erstellt eine Routen-Gruppe mit gemeinsamem Prefix und Middleware. Gruppen können beliebig tief verschachtelt werden. |
| use(MiddlewareInterface $middleware) | void | Fügt globale Middleware hinzu, die bei jeder Route ausgeführt wird. |
| registerController(string $controllerClass) | void | Scannt eine Controller-Klasse nach #[Route]-Attributen und registriert alle gefundenen Routen automatisch. |
| dispatch(?Request $request) | Response | Verarbeitet den eingehenden Request. Gibt 404 zurück wenn keine Route passt, 405 wenn der Pfad existiert aber die HTTP-Methode nicht erlaubt ist. |
| url(string $name, array $params = []) | string | Generiert eine URL für eine benannte Route. Wirft InvalidArgumentException wenn der Name unbekannt ist oder ein Parameter fehlt. |
Routengruppen
Gruppen ermöglichen gemeinsame Prefixes und Middleware für mehrere Routen:
PHP
// API-Gruppe mit Prefix und Auth-Middleware
$router->group('api', [AuthMiddleware::class, RateLimitMiddleware::class], function(Router $r) {
$r->get('/users', UserController::class, 'index');
$r->post('/users', UserController::class, 'store');
// Verschachtelte Gruppe
$r->group('admin', [AdminMiddleware::class], function(Router $r) {
$r->delete('/users/{id}', UserController::class, 'destroy');
// Pfad: /api/admin/users/{id}
});
});
// Öffentliche Routen ohne Middleware
$router->group('auth', [], function(Router $r) {
$r->get('/login', AuthController::class, 'showLogin');
$r->post('/login', AuthController::class, 'login');
$r->post('/logout', AuthController::class, 'logout');
});
Route-Parameter
PHP – Parameter-Syntax
// Pflicht-Parameter
$router->get('/users/{id}', UserController::class, 'show');
// Optionaler Parameter
$router->get('/articles/{slug?}', ArticleController::class, 'index');
// Mehrere Parameter
$router->get('/shop/{category}/{product}', ShopController::class, 'show');
// Constraints über RouteBuilder
$router->get('/users/{id}', UserController::class, 'show')
->whereNumber('id'); // Nur Ganzzahlen
$router->get('/articles/{slug}', ArticleController::class, 'show')
->whereSlug('slug'); // URL-Slug: a-z0-9 und Bindestriche
$router->get('/items/{uuid}', ItemController::class, 'show')
->whereUuid('uuid'); // UUID v4
PHP – Parameter im Controller lesen
class UserController
{
public function show(Request $request, string $id): Response
{
// $id kommt direkt als Parameter
$user = User::find((int) $id);
return Response::json($user);
}
}
Attribut-basiertes Routing
PHP
use App\Routing\Route;
use App\Routing\HttpMethod;
class UserController
{
#[Route('/users', HttpMethod::GET, name: 'users.index')]
public function index(Request $request): Response { ... }
#[Route('/users/{id}', HttpMethod::GET, name: 'users.show')]
public function show(Request $request, string $id): Response { ... }
#[Route('/users', HttpMethod::POST, name: 'users.store',
middleware: [CsrfMiddleware::class])]
public function store(Request $request): Response { ... }
}
// Controller registrieren
$router->registerController(UserController::class);
URL-Generierung
PHP
// Route benennen
$router->get('/users/{id}', UserController::class, 'show')->name('users.show');
$router->get('/shop/{cat}/{product}', ShopController::class, 'show')->name('shop.product');
// URL generieren
$url = $router->url('users.show', ['id' => 42]);
// → /users/42
$url = $router->url('shop.product', ['cat' => 'electronics', 'product' => 'laptop']);
// → /shop/electronics/laptop
// Mit Query-String (überschüssige Parameter)
$url = $router->url('users.show', ['id' => 42, 'tab' => 'profile']);
// → /users/42?tab=profile
Globale Middleware
PHP
// Globale Middleware (wird bei JEDER Route ausgeführt)
$router->use(new SecurityHeadersMiddleware());
// Routen-spezifisch
$router->post('/login', AuthController::class, 'login')
->middleware(CsrfMiddleware::class, RateLimitMiddleware::class);
// Gruppen-Middleware
$router->group('admin', [AuthMiddleware::class], function(Router $r) {
// Alle Routen hier erfordern Authentifizierung
$r->get('/dashboard', DashboardController::class, 'index');
});