Utilizar� el matching con criteria donde los par�metros filters realizar�n "field like %value%". * &filters[qb-ids] => Require qb-criteria. This option filter by ids separated by ','. ie. &filters[qb-ids]=1,2,8,9. */ 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']); } else { $disableTenancy = true; // tengo que buscar por tenencia. $tenancyService = $this->getTenancyService(); $tenancyService->disableFilter(); // dejar esta linea para los casos en que no se modificaron las url de los otros modulos // que hacen referencia a este filtro unset($filters['disableTenancy']); } $orWhere = false; if (isset($filters['orWhere'])) { // cambia el and por or en la cosulta $orWhere = true; unset($filters['orWhere']); } if (isset($filters['qb-criteria'])) { try { unset($filters['qb-criteria']); $criteria = new \Doctrine\Common\Collections\Criteria(); if(isset($filters['qb-ids'])) { $criteria->where($criteria->expr()->in('id', explode(",",$filters["qb-ids"]))); } else { foreach ($filters as $field => $value) { if ($orWhere) { if (is_numeric($value) && $field != 'externalId') { $criteria->orWhere($criteria->expr()->in("$field", (is_array($value) ? $value : [$value]))); } else { $value = urldecode($value); $criteria->orWhere($criteria->expr()->contains("$field", "$value")); } } else { if (is_numeric($value) && $field != 'externalId') { $criteria->andWhere($criteria->expr()->in("$field", (is_array($value) ? $value : [$value]))); } else { $value = urldecode($value); $criteria->andWhere($criteria->expr()->contains("$field", "$value")); } } } if (!is_null($paramFetcher->get('limit'))) { $criteria->setMaxResults($paramFetcher->get('limit')); } } if (!is_null($paramFetcher->get('offset'))) { $criteria->setFirstResult($paramFetcher->get('offset')); } 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)); } /** * Funcion que busca el nombre de los campos que poseen error. * @param Form $form Contiene el formulario. * @return array Retorna un array con los nombre de los campos invalidos para el formulario. */ private function getFormFieldError(Form $form) { $errorField = array(); foreach ($form as $child) { if ($child->isSubmitted() && $child->isValid()) { continue; } else { $errorField[] = $child->getName(); } } } /** * @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'); } /** * @return bool Retorna TRUE si estoy en el modulo base. */ public function isModuleBase() { return array_key_exists('BaseTenancyBundle', $this->getParameter('kernel.bundles')); } /** * 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)) { if ($this->isModuleBase()) { $tenancy = $this->getDoctrine()->getRepository('BaseTenancyBundle:Tenancy')->findOneById($parameters['tenancy']); $entity->setTenancy($tenancy); $service->setTenancy($parameters['tenancy']); } else { $entity->setTenancyId($parameters['tenancy']); $service->setTenancy($parameters['tenancy']); } } } return $entity; } /** * Create a 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; } else { var_dump($this->getFormFieldError($form)); } return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR); } /** * Update a 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->getTraceAsString(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } /** * Partial Update to a 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 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 entity * * @View(serializerEnableMaxDepthChecks=true) * * @param mixed $entity Contiene la entidad. * * @return mixed|Response Retorna los datos de la entidad o un mensaje de error. En caso de no encontrar * el valor buscado devuelve un vacio. */ public function getAction($entity) { try { if (is_object($entity)) { $entity = $this->getObjectFindById($entity, $entity->getId()); } else { $entity = $this->getObjectFindById(null, $entity); } return $entity; } catch (\Exception $e) { return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR); } } /** * Se ejecuta el comando amqp:remote por AMQP * * @global kernel $kernel * * @param string $name * @param array $cmd_args * * @return string */ public function runCommand($name, $cmd_args = array()) { $kernel = $this->get('kernel'); $application = new Application($kernel); $application->setAutoExit(false); $args = [ '', 'amqp:remote', $name, '--route=' . getenv("AMQP_KEY"), ]; foreach ($cmd_args as $cmd_arg) { $args[] = "--args={$cmd_arg}"; } $input = new ArgvInput($args); $output = new BufferedOutput(); $application->run($input, $output); return $output->fetch(); } }