소스 검색

RESTController generico andando

gabriel 7 년 전
부모
커밋
d0502d1280
1개의 변경된 파일74개의 추가작업 그리고 16개의 파일을 삭제
  1. 74 16
      Controller/RESTController.php

+ 74 - 16
Controller/RESTController.php

@@ -60,14 +60,14 @@ abstract class RESTController extends VoryxController
         $filters = !is_null($paramFetcher->get('filters')) ? $paramFetcher->get('filters') : array();
         if (isset($filters['tenancyId'])) {
             // tengo que buscar por tenencia.
-            $tenancyService = $this->container->get('base_tenancy.tenancy_service');
+            $tenancyService = $this->getTenancyService();
             $tenancyService->setTenancy($filters['tenancyId']);
             unset($filters['tenancyId']);
         }
         if (isset($filters['disableTenancy'])) {
             $disableTenancy = true;
             // tengo que buscar por tenencia.
-            $tenancyService = $this->container->get('base_tenancy.tenancy_service');
+            $tenancyService = $this->getTenancyService();
             $tenancyService->disableFilter();
             unset($filters['disableTenancy']);
         }
@@ -101,7 +101,7 @@ abstract class RESTController extends VoryxController
                 $repo = $em->getRepository($this->getRepository());
                 $entities = $repo->matching($criteria)->toArray();
 
-                if($disableTenancy) $tenancyService->enableFilter();
+                if ($disableTenancy) $tenancyService->enableFilter();
                 if ($entities) {
                     return $entities;
                 }
@@ -116,8 +116,9 @@ abstract class RESTController extends VoryxController
                 $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 ($disableTenancy) {
+                    $tenancyService->enableFilter();
+                }
                 if ($entities) {
                     return $entities;
                 }
@@ -130,16 +131,69 @@ abstract class RESTController extends VoryxController
 
         return array();
     }
+
     /**
      * @return object Retorna el nombre de la Entity de trabajo.
      */
-    public function getObject()
+    public function getObjectNew($entity = null)
     {
-        $obj = $this->getDoctrine()->getManager()->getMetadataFactory()->getMetadataFor($this->getRepository())->getName();
+        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.
      *
@@ -148,21 +202,17 @@ abstract class RESTController extends VoryxController
      * @param Request $request Contiene el request.
      *
      * @return FOSView|mixed Retorna el FOSView o la entidad.
-     *
      */
     public function postAction(Request $request)
     {
-//        file_put_contents("/tmp/t", "LLEGO\n",8);
-        $entity = $this->getObject();
+        $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->isSubmitted() && $form->isValid()) {
+        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);
@@ -181,17 +231,25 @@ abstract class RESTController extends VoryxController
     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);
@@ -227,9 +285,9 @@ abstract class RESTController extends VoryxController
     {
         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);