getDoctrine() ->getRepository($this->getEntityClass()) ->find($id); } /** * Count the number of entities * * By default, count all entities. You can customize the query by * using the method `customizeQuery`. * * @param string $action * @param Request $request * @return int */ protected function countEntities(string $action, Request $request, $_format): int { return $this->buildQueryEntities($action, $request) ->select('COUNT(e)') ->getQuery() ->getSingleScalarResult() ; } /** * Query the entity. * * By default, get all entities. You can customize the query by using the * method `customizeQuery`. * * The method `orderEntity` is called internally to order entities. * * It returns, by default, a query builder. * */ protected function queryEntities(string $action, Request $request, string $_format, PaginatorInterface $paginator) { $query = $this->buildQueryEntities($action, $request) ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber()) ->setMaxResults($paginator->getItemsPerPage()); // allow to order queries and return the new query return $this->orderQuery($action, $query, $request, $paginator, $_format); } /** * Add ordering fields in the query build by self::queryEntities * */ protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator, $_format) { return $query; } /** * Build the base query for listing all entities. * * This method is used internally by `countEntities` `queryEntities` * * This base query does not contains any `WHERE` or `SELECT` clauses. You * can add some by using the method `customizeQuery`. * * The alias for the entity is "e". * * @param string $action * @param Request $request * @return QueryBuilder */ protected function buildQueryEntities(string $action, Request $request) { $qb = $this->getDoctrine()->getManager() ->createQueryBuilder() ->select('e') ->from($this->getEntityClass(), 'e') ; $this->customizeQuery($action, $request, $qb); return $qb; } protected function customizeQuery(string $action, Request $request, $query): void {} /** * Get the result of the query */ protected function getQueryResult(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query) { return $query->getQuery()->getResult(); } protected function onPreIndex(string $action, Request $request, string $_format): ?Response { return null; } /** * method used by indexAction */ protected function onPreIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator): ?Response { return null; } /** * method used by indexAction */ protected function onPostIndexBuildQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $query): ?Response { return null; } /** * method used by indexAction */ protected function onPostIndexFetchQuery(string $action, Request $request, string $_format, int $totalItems, PaginatorInterface $paginator, $entities): ?Response { return null; } /** * Get the complete FQDN of the class * * @return string the complete fqdn of the class */ protected function getEntityClass(): string { return $this->crudConfig['class']; } /** * called on post fetch entity */ protected function onPostFetchEntity(string $action, Request $request, $entity, $_format): ?Response { return null; } /** * Called on post check ACL */ protected function onPostCheckACL(string $action, Request $request, string $_format, $entity): ?Response { return null; } /** * check the acl. Called by every action. * * By default, check the role given by `getRoleFor` for the value given in * $entity. * * Throw an \Symfony\Component\Security\Core\Exception\AccessDeniedHttpException * if not accessible. * * @throws \Symfony\Component\Security\Core\Exception\AccessDeniedHttpException */ protected function checkACL(string $action, Request $request, string $_format, $entity = null) { $this->denyAccessUnlessGranted($this->getRoleFor($action, $request, $entity, $_format), $entity); } /** * * @return string the crud name */ protected function getCrudName(): string { return $this->crudConfig['name']; } protected function getActionConfig(string $action) { return $this->crudConfig['actions'][$action]; } /** * Set the crud configuration * * Used by the container to inject configuration for this crud. */ public function setCrudConfig(array $config): void { $this->crudConfig = $config; } /** * @return PaginatorFactory */ protected function getPaginatorFactory(): PaginatorFactory { return $this->container->get('chill_main.paginator_factory'); } }