Skip to content

Ajouter une deuxième entité de domaine ​

Ce guide explique comment ajouter une deuxième entité de domaine en suivant le même modèle que les exemples intégrés Note et Tag.

Prérequis : Avoir complété Ajouter un endpoint avec BDD.


Vue d'ensemble ​

Chaque entité suit la même structure :

src/Example/YourEntity/
  YourEntity.php
  YourEntityRepositoryInterface.php
  PdoYourEntityRepository.php
  GetYourEntityByIdHandler.php
  YourEntityRouteRegistrar.php   ← enregistre les routes via __invoke(Router)
  YourEntityServiceProvider.php  ← câblage DI + registrar de routes

Seul RuntimeServiceProvider reçoit le nouveau registrar et le gestionnaire d'exception — RuntimeApplicationFactory ne change pas.


Étapes clés ​

1 — RouteRegistrar ​

Les paramètres de chemin (ex. id dans /products/{id}) sont lus dans les handlers via Router::PARAMETERS_ATTRIBUTE, pas comme attributs PSR-7 individuels :

php
$params = $request->getAttribute(Router::PARAMETERS_ATTRIBUTE, []);
$id     = (int) ($params['id'] ?? 0);
// $request->getAttribute('id') retourne toujours null.
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 ​

Enregistrez le registrar sous la clé nene2.route_registrar.product dans register().

3 — Câblage dans RuntimeServiceProvider ​

php
$builder->addProvider(new ProductServiceProvider());

// set() après addProvider() remplace un seul service (dernier écrit gagne).
// $builder->set(RuntimeApplicationFactory::class, static fn($c) => new RuntimeApplicationFactory(/* ... */));

return new RuntimeApplicationFactory(
    /* ... */,
    [$noteNotFoundHandler, $tagNotFoundHandler, $productNotFoundHandler],
    $requestIdHolder,
    [$noteRegistrar, $tagRegistrar, $productRegistrar],
    $bearerMiddleware,
);

Pour plus de détails, voir la version anglaise ou les exemples Note / Tag dans src/Example/.

Publié sous licence MIT.