(clients ayant >= 1 categorie de ce type) ; * - pagination obligatoire (convention Starseed ERP-72) : Paginator ORM ; * echappatoire ?pagination=false pour alimenter un cote front). if (!$this->pagination->isEnabled($operation, $context)) { // @var list $result return $qb->getQuery()->getResult(); } $limit = $this->pagination->getLimit($operation, $context); $page = max(1, $this->pagination->getPage($context)); $offset = ($page - 1) * $limit; $qb->setFirstResult($offset)->setMaxResults($limit); // fetchJoinCollection: true pour un COUNT correct des que des JOINs // to-many seront ajoutes (sous-collections embarquees en detail). return new Paginator(new DoctrinePaginator($qb->getQuery(), fetchJoinCollection: true)); } /** * @param array $uriVariables */ private function provideItem(array $uriVariables): ?Client { $id = $uriVariables['id'] ?? null; if (!is_int($id) && !(is_string($id) && ctype_digit($id))) { return null; } $client = $this->repository->findById((int) $id); if (null === $client) { return null; } // Soft-delete : jamais expose au M1 (HP-M2-1) — 404 via retour null. // Les archives restent visibles en detail (consultation + restauration). if (null !== $client->getDeletedAt()) { return null; } return $client; } /** * Lit un flag booleen issu des query params. Accepte true / "true" / "1". */ private function readBool(mixed $raw): bool { if (is_bool($raw)) { return $raw; } return is_string($raw) && in_array(strtolower($raw), ['true', '1'], true); } }