Eine zweite Domain-Entität hinzufügen
Diese Anleitung zeigt, wie eine zweite Domain-Entität nach demselben Muster wie die eingebauten Beispiele Note und Tag hinzugefügt wird.
Voraussetzung: Datenbankendpunkt hinzufügen abgeschlossen haben.
Übersicht
Jede Entität folgt derselben Struktur:
src/Example/YourEntity/
YourEntity.php
YourEntityRepositoryInterface.php
PdoYourEntityRepository.php
GetYourEntityByIdHandler.php
YourEntityRouteRegistrar.php ← registriert Routen via __invoke(Router)
YourEntityServiceProvider.php ← DI-Konfiguration + Routen-RegistrarNur RuntimeServiceProvider erhält den neuen Registrar und Exception-Handler — RuntimeApplicationFactory bleibt unverändert.
Wichtige Schritte
1 — RouteRegistrar
Pfadparameter (z. B. id in /products/{id}) werden in Handler-Methoden aus Router::PARAMETERS_ATTRIBUTE gelesen, nicht als individuelle PSR-7-Attribute:
php
$params = $request->getAttribute(Router::PARAMETERS_ATTRIBUTE, []);
$id = (int) ($params['id'] ?? 0);
// $request->getAttribute('id') gibt immer null zurück.php
final readonly class ProductRouteRegistrar
{
public function __construct(
private GetProductByIdHandler $getHandler,
private ListProductsHandler $listHandler,
) {}
public function __invoke(Router $router): void
{
$get = $this->getHandler;
$list = $this->listHandler;
$router->get('/examples/products', static fn ($r) => $list->handle($r));
$router->get('/examples/products/{id}', static fn ($r) => $get->handle($r));
}
}2 — ServiceProvider
Registrar unter dem Schlüssel nene2.route_registrar.product in register() eintragen.
3 — In RuntimeServiceProvider verdrahten
php
$builder->addProvider(new ProductServiceProvider());
// set() nach addProvider() überschreibt einen einzelnen Dienst (Last-Write-Wins).
// $builder->set(RuntimeApplicationFactory::class, static fn($c) => new RuntimeApplicationFactory(/* ... */));
return new RuntimeApplicationFactory(
/* ... */,
[$noteNotFoundHandler, $tagNotFoundHandler, $productNotFoundHandler],
$requestIdHolder,
[$noteRegistrar, $tagRegistrar, $productRegistrar],
$bearerMiddleware,
);Details siehe englische Version oder die Beispiele Note/Tag in src/Example/.