Skip to content

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-Registrar

Nur 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/.

Veröffentlicht unter der MIT-Lizenz.