Utilizará el matching con criteria donde los parámetros filters realizarán "field like %value%". */ public function cgetAction(ParamFetcherInterface $paramFetcher) { $em = $this->getDoctrine()->getManager(); $disableTenancy = false; $filters = !is_null($paramFetcher->get('filters')) ? $paramFetcher->get('filters') : array(); if (isset($filters['tenancyId'])) { // tengo que buscar por tenencia. $tenancyService = $this->getTenancyService(); $tenancyService->setTenancy($filters['tenancyId']); unset($filters['tenancyId']); } if (isset($filters['disableTenancy'])) { $disableTenancy = true; // tengo que buscar por tenencia. $tenancyService = $this->getTenancyService(); $tenancyService->disableFilter(); unset($filters['disableTenancy']); } if (isset($filters['qb-criteria'])) { try { unset($filters['qb-criteria']); $criteria = new \Doctrine\Common\Collections\Criteria(); foreach ($filters as $field => $value) { $criteria->andWhere($criteria->expr()->contains("$field", "$value")); } if (!is_null($paramFetcher->get('offset'))) { $criteria->setFirstResult($paramFetcher->get('offset')); } if (!is_null($paramFetcher->get('limit'))) { $criteria->setMaxResults($paramFetcher->get('limit')); } if ($paramFetcher->get('order_by')) { $order_by = $paramFetcher->get('order_by'); $orderBy = array(); foreach ($order_by as $field => $order) { $orderBy[$field] = $order; } $criteria->orderBy($orderBy); } $repo = $em->getRepository($this->getRepository()); $entities = $repo->matching($criteria)->toArray(); if ($disableTenancy) $tenancyService->enableFilter(); if ($entities) { return $entities; } } catch (\Exception $e) { return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } else { try { $offset = $paramFetcher->get('offset'); $limit = $paramFetcher->get('limit'); $order_by = $paramFetcher->get('order_by'); $entities = $em->getRepository($this->getRepository())->findBy($filters, $order_by, $limit, $offset); if ($disableTenancy) { $tenancyService->enableFilter(); } if ($entities) { return $entities; } } catch (\Exception $e) { return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } return array(); } /** * @return object Retorna el nombre de la Entity de trabajo. */ public function getObjectNew($entity = null) { if ($entity == null) { $entity = $this->getRepository(); } $obj = $this->getDoctrine()->getManager()->getMetadataFactory()->getMetadataFor($entity)->getName(); $rc = new ReflectionClass($obj); return $rc->newInstance(); } /** * @param string $entity Contiene el nombre de la entidad a buscar en el repositorio. * @param string $id Contiene el id a buscar. * @return object Retorna el nombre de la Entity de trabajo. */ public function getObjectFindById($entity = null, $id) { if ($entity == null) { $entity = $this->getRepository(); } return $this->getDoctrine()->getRepository($entity)->findOneBy(array('id' => $id)); } /** * @return object Retorna el objeto tenencia. */ protected function getObjectTenancy() { return $this->getObjectNew('BaseTenancyBundle:Tenancy'); } /** * @return object Retorna el servicio de tenencias. */ protected function getTenancyService() { return $this->get('base_tenancy.tenancy_service'); } /** * Funcion que checkea y setea la tenencia en el objeto. * @param Request $request Contiene el request. * @param object $entity Contiene la entidad a chequear. * @return object Retorna el objeto procesado. */ private function checkTenancy(Request $request, $entity) { $parameters = $request->request->all(); $service = $this->getTenancyService(); if ($service->implementTenancyInterface($entity)) { if (array_key_exists('tenancy', $parameters)) { $tenancy = $this->getDoctrine()->getRepository('BaseTenancyBundle:Tenancy')->findOneById($parameters['tenancy']); $entity->setTenancy($tenancy); $service->setTenancy($parameters['tenancy']); } } return $entity; } /** * Create a Client entity. * * @View(statusCode=201, serializerEnableMaxDepthChecks=true) * * @param Request $request Contiene el request. * * @return FOSView|mixed Retorna el FOSView o la entidad. */ public function postAction(Request $request) { $entity = $this->checkTenancy($request, $this->getObjectNew()); $form = $this->createForm($this->getFormEntityType(), $entity, array("method" => $request->getMethod())); $this->removeExtraFields($request, $form); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($entity); $em->flush(); return $entity; } return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR); } /** * Update a Client entity. * * @View(serializerEnableMaxDepthChecks=true) * * @param Request $request Contiene el request. * @param mixed $entity Contiene la entidad * * @return FOSView|mixed Retorna el FOSView o la entidad. */ public function putAction(Request $request, $entity = null) { try { // obtengo el entitymanager $em = $this->getDoctrine()->getManager(); // obtengo la entidad que deseo modificar $entity = $this->getObjectFindById(null, $entity); // seteo la tenencia en caso de necesitarla $entity = $this->checkTenancy($request, $entity); $request->setMethod('PATCH'); //Treat all PUTs as PATCH // creo el formulario, esto no lo tenia ningun web service $form = $this->createForm($this->getFormEntityType(), $entity, array("method" => $request->getMethod())); // saco los campos extras $this->removeExtraFields($request, $form); // agrego el handler $form->handleRequest($request); // valido el formulario if ($form->isValid()) { // actualizo los datos. $em->flush(); return $entity; } return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR); } catch (\Exception $e) { return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } /** * Partial Update to a Client entity. * * @View(serializerEnableMaxDepthChecks=true) * * @param Request $request Contiene el request. * @param mixed $entity Contiene la entidad. * * @return Response Retorna un response. */ public function patchAction(Request $request, $entity) { return $this->putAction($request, $entity); } /** * Delete a Client entity. * * @View(statusCode=204) * * @param Request $request Contiene el request. * @param mixed $entity Contiene la entidad a borrar. * * @return FOSView Retorna el FSOView. */ public function deleteAction(Request $request, $entity) { try { $em = $this->getDoctrine()->getManager(); $entity = $this->getObjectFindById(null, $entity); $em->remove($entity); $em->flush(); return null; } catch (\Exception $e) { return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } /** * Get a Client entity * * @View(serializerEnableMaxDepthChecks=true) * * @param mixed $entity Contiene la entidad. * * @return Response * */ public function getAction($entity) { return $entity; } }