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)); } /** * 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) { $logger = $this->get('logger'); try { $logger->err("putAction: 1"); // obtengo el entitymanager $em = $this->getDoctrine()->getManager(); $logger->err("putAction: 2"); // obtengo la entidad que deseo modificar $entity = $this->getObjectFindById(null, $entity); $logger->err("putAction: 3"); // seteo la tenencia en caso de necesitarla $entity = $this->checkTenancy($request, $entity); $logger->err("putAction: 4"); $request->setMethod('PATCH'); //Treat all PUTs as PATCH $logger->err("putAction: 5"); // creo el formulario, esto no lo tenia ningun web service $form = $this->createForm($this->getFormEntityType(), $entity, array("method" => $request->getMethod())); $logger->err("putAction: 6"); // saco los campos extras $this->removeExtraFields($request, $form); $logger->err("putAction: 7"); // agrego el handler $form->handleRequest($request); $logger->err("putAction: 8"); // valido el formulario $logger->err("antes de validar el formulario:"); if ($form->isValid()) { $logger->err("valores:"); foreach ($form as $child) { $logger->err($child->getName() . " - " . $child->getData()); } $logger->err("FIN valores:"); // actualizo los datos. $em->flush(); return $entity; } else { var_dump($this->getFormFieldError($form)); } return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_INTERNAL_SERVER_ERROR); } catch (\Exception $e) { $logger->err("putAction: ERROR " . $e->getTraceAsString()); return FOSView::create($e->getMessage(), 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 Response * */ public function getAction($entity) { return $entity; } }