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