countryRepository = $countryRepository; $this->postalCodeRepository = $postalCodeRepository; $this->paginatorFactory = $paginatorFactory; } /** * @Route("/api/1.0/main/postal-code/search.json") */ public function search(Request $request): JsonResponse { $this->denyAccessUnlessGranted('ROLE_USER'); if (!$request->query->has('q')) { throw new BadRequestHttpException('You must supply a "q" parameter'); } $pattern = $request->query->get('q'); if ('' === trim($pattern)) { throw new BadRequestHttpException('the search pattern is empty'); } if ($request->query->has('country')) { $country = $this->countryRepository->find($request->query->getInt('country')); if (null === $country) { throw new NotFoundHttpException('country not found'); } } else { $country = null; } $nb = $this->postalCodeRepository->countByPattern($pattern, $country); $paginator = $this->paginatorFactory->create($nb); $codes = $this->postalCodeRepository->findByPattern( $pattern, $country, $paginator->getCurrentPageFirstItemNumber(), $paginator->getItemsPerPage() ); return $this->json( new Collection($codes, $paginator), Response::HTTP_OK, [], [AbstractNormalizer::GROUPS => ['read']] ); } protected function customizeQuery(string $action, Request $request, $qb): void { if ($request->query->has('country')) { $qb->where('e.country = :country') ->setParameter('country', $request->query->get('country')); } $qb->andWhere('e.origin = :zero') ->setParameter('zero', 0); } }