浏览代码

Improving routes creations (when using the new CRUD controllers) using the ReflectionControllerProvider class CRUD see #6264

Julio Montoya 11 年之前
父节点
当前提交
c880b08a09

+ 4 - 97
main/inc/routes.php

@@ -659,104 +659,11 @@ $app->match('/admin/administrator/', 'admin.controller:indexAction', 'GET')
     ->assert('type', '.+')
     ->bind('admin_administrator');
 
-$app->match('/admin/administrator/roles/', 'role.controller:indexAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles');
-
-$app->match('/admin/administrator/roles/{id}', 'role.controller:readAction', 'GET')
-    ->assert('type', '.+')
-    ->assert('id', '\d+')
-    ->bind('admin_administrator_roles_read');
-
-$app->match('/admin/administrator/roles/add', 'role.controller:addAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles_add');
-
-$app->match('/admin/administrator/roles/create', 'role.controller:createAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles_create');
-
-$app->match('/admin/administrator/roles/{id}/edit', 'role.controller:editAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles_edit');
-
-$app->match('/admin/administrator/roles/{id}/update', 'role.controller:updateAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles_update');
-
-$app->match('/admin/administrator/roles/{id}/delete', 'role.controller:deleteAction', 'DELETE')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_roles_delete');
-
-// Question score name
-$app->match('/admin/administrator/question_score_names/', 'question_score_name.controller:indexAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names');
-
-$app->match('/admin/administrator/question_score_names/{id}', 'question_score_name.controller:readAction', 'GET')
-    ->assert('type', '.+')
-    ->assert('id', '\d+')
-    ->bind('admin_administrator_question_score_names_read');
-
-$app->match('/admin/administrator/question_score_names/add', 'question_score_name.controller:addAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names_add');
-
-$app->match('/admin/administrator/question_score_names/create', 'question_score_name.controller:createAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names_create');
-
-$app->match('/admin/administrator/question_score_names/{id}/edit', 'question_score_name.controller:editAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names_edit');
-
-$app->match('/admin/administrator/question_score_names/{id}/update', 'question_score_name.controller:updateAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names_update');
-
-$app->match('/admin/administrator/question_score_names/{id}/delete', 'question_score_name.controller:deleteAction', 'DELETE')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_names_delete');
-
-// Question score
-$app->match('/admin/administrator/question_scores/', 'question_score.controller:indexAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_scores');
-
-$app->match('/admin/administrator/question_scores/{id}', 'question_score.controller:readAction', 'GET')
-    ->assert('type', '.+')
-    ->assert('id', '\d+')
-    ->bind('admin_administrator_question_score_read');
-
-$app->match('/admin/administrator/question_scores/add', 'question_score.controller:addAction', 'GET')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_add');
-
-$app->match('/admin/administrator/question_scores/create', 'question_score.controller:createAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_create');
-
-$app->match('/admin/administrator/question_scores/{id}/edit', 'question_score.controller:editAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_edit');
-
-$app->match('/admin/administrator/question_scores/{id}/update', 'question_score.controller:updateAction', 'POST')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_update');
-
-$app->match('/admin/administrator/question_scores/{id}/delete', 'question_score.controller:deleteAction', 'DELETE')
-    ->assert('type', '.+')
-    ->bind('admin_administrator_question_score_delete');
-
-/*new \ChamiloLMS\Controller\TestController($app);
-new \ChamiloLMS\Controller\TestController($app);*/
-
-
-// Takes a lot of time to load
-//$app->mount('/roles', 'exercise_manager.controller:getProvider');
 
-// Takes a lot of time to load
-///$app->mount('/roles', new ChamiloLMS\Provider\ReflectionControllerProvider('role.controller'));
+// Takes a some time to load @todo improve this calls
+$app->mount('/admin/administrator/roles', new ChamiloLMS\Provider\ReflectionControllerProvider('role.controller'));
+$app->mount('/admin/administrator/question_scores', new ChamiloLMS\Provider\ReflectionControllerProvider('question_score.controller'));
+$app->mount('/admin/administrator/question_score_names', new ChamiloLMS\Provider\ReflectionControllerProvider('question_score_name.controller'));
 
 $app->match('/ajax', 'model_ajax.controller:indexAction', 'GET')
     ->assert('type', '.+')

+ 2 - 2
main/inc/services.php

@@ -595,13 +595,13 @@ $app['role.controller'] = $app->share(
 
 $app['question_score.controller'] = $app->share(
     function () use ($app) {
-        return new ChamiloLMS\Controller\Admin\Administrator\QuestionScore($app);
+        return new ChamiloLMS\Controller\Admin\Administrator\QuestionScoreController($app);
     }
 );
 
 $app['question_score_name.controller'] = $app->share(
     function () use ($app) {
-        return new ChamiloLMS\Controller\Admin\Administrator\QuestionScoreName($app);
+        return new ChamiloLMS\Controller\Admin\Administrator\QuestionScoreNameController($app);
     }
 );
 

+ 38 - 16
src/ChamiloLMS/Controller/Admin/Administrator/QuestionScore.php → src/ChamiloLMS/Controller/Admin/Administrator/QuestionScoreController.php

@@ -18,13 +18,22 @@ use ChamiloLMS\Form\QuestionScoreType;
  * @package ChamiloLMS\Controller
  * @author Julio Montoya <gugli100@gmail.com>
  */
-class QuestionScore extends CommonController
+class QuestionScoreController extends CommonController
 {
+    /**
+     * @Route("/")
+     * @Method({"GET"})
+     */
     public function indexAction()
     {
         return parent::listingAction();
     }
 
+    /**
+    *
+    * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function readAction($id)
     {
         // return parent::readAction($id);
@@ -39,40 +48,53 @@ class QuestionScore extends CommonController
         return new Response($response, 200, array());
     }
 
+    /**
+    * @Route("/add")
+    * @Method({"GET"})
+    */
     public function addAction()
     {
         return parent::addAction();
     }
 
+    /**
+    *
+    * @Route("/{id}/edit", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function editAction($id)
     {
         return parent::editAction($id);
     }
 
+    /**
+    *
+    * @Route("/{id}/delete", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function deleteAction($id)
     {
         return parent::deleteAction($id);
     }
 
+    protected function generateDefaultCrudRoutes()
+    {
+        $routes = parent::generateDefaultCrudRoutes();
+        $routes['question_score_name_read_link'] = 'question_score_name.controller:readAction';
+        return $routes ;
+    }
+
     /**
-     * Return an array with the string that are going to be generating by twig.
-     * @return array
-     */
-    protected function generateLinks()
+    * {@inheritdoc}
+    */
+    protected function getControllerAlias()
     {
-        return array(
-            'create_link' => 'admin_administrator_question_score_add',
-            'read_link' => 'admin_administrator_question_score_read',
-            'update_link' => 'admin_administrator_question_score_edit',
-            'delete_link' => 'admin_administrator_question_score_delete',
-            'list_link' => 'admin_administrator_question_scores',
-            'question_score_name_read_link' => 'admin_administrator_question_score_names_read'
-        );
+        return 'question_score.controller';
     }
 
-   /**
-     * {@inheritdoc}
-     */
+    /**
+    * {@inheritdoc}
+    */
     protected function getRepository()
     {
         return $this->get('orm.em')->getRepository('Entity\QuestionScore');

+ 26 - 13
src/ChamiloLMS/Controller/Admin/Administrator/QuestionScoreName.php → src/ChamiloLMS/Controller/Admin/Administrator/QuestionScoreNameController.php

@@ -18,46 +18,59 @@ use ChamiloLMS\Form\QuestionScoreNameType;
  * @package ChamiloLMS\Controller
  * @author Julio Montoya <gugli100@gmail.com>
  */
-class QuestionScoreName extends CommonController
+class QuestionScoreNameController extends CommonController
 {
+    /**
+     * @Route("/")
+     * @Method({"GET"})
+     */
     public function indexAction()
     {
         return parent::listingAction();
     }
 
+    /**
+    *
+    * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function readAction($id)
     {
         return parent::readAction($id);
     }
 
+    /**
+    * @Route("/add")
+    * @Method({"GET"})
+    */
     public function addAction()
     {
         return parent::addAction();
     }
 
+    /**
+    *
+    * @Route("/{id}/edit", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function editAction($id)
     {
         return parent::editAction($id);
     }
 
+    /**
+    *
+    * @Route("/{id}/delete", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function deleteAction($id)
     {
         return parent::deleteAction($id);
     }
 
-    /**
-     * Return an array with the string that are going to be generating by twig.
-     * @return array
-     */
-    protected function generateLinks()
+    protected function getControllerAlias()
     {
-        return array(
-            'create_link' => 'admin_administrator_question_score_names_add',
-            'read_link' => 'admin_administrator_question_score_names_read',
-            'update_link' => 'admin_administrator_question_score_names_edit',
-            'delete_link' => 'admin_administrator_question_score_names_delete',
-            'list_link' => 'admin_administrator_question_score_names'
-        );
+        return 'question_score_name.controller';
     }
 
     /**

+ 28 - 12
src/ChamiloLMS/Controller/Admin/Administrator/RoleController.php

@@ -9,6 +9,8 @@ use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
 use Symfony\Component\HttpFoundation\Response;
 use Entity;
 use ChamiloLMS\Form\RoleType;
+use Symfony\Component\Routing\Annotation\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 
 /**
  * Class RoleController
@@ -18,44 +20,58 @@ use ChamiloLMS\Form\RoleType;
  */
 class RoleController extends CommonController
 {
+    /**
+     *
+     * @Route("/")
+     * @Method({"GET"})
+     */
     public function indexAction()
     {
         return parent::listingAction();
     }
 
+    /**
+    *
+    * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function readAction($id)
     {
         return parent::readAction($id);
     }
 
+    /**
+    * @Route("/add")
+    * @Method({"GET"})
+    */
     public function addAction()
     {
         return parent::addAction();
     }
 
+    /**
+    *
+    * @Route("/{id}/edit", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function editAction($id)
     {
         return parent::editAction($id);
     }
 
+    /**
+    *
+    * @Route("/{id}/delete", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
     public function deleteAction($id)
     {
         return parent::deleteAction($id);
     }
 
-    /**
-     * Return an array with the string that are going to be generating by twig.
-     * @return array
-     */
-    protected function generateLinks()
+    protected function getControllerAlias()
     {
-        return array(
-            'create_link' => 'admin_administrator_roles_add',
-            'read_link' => 'admin_administrator_roles_read',
-            'update_link' => 'admin_administrator_roles_edit',
-            'delete_link' => 'admin_administrator_roles_delete',
-            'list_link' => 'admin_administrator_roles'
-        );
+        return 'role.controller';
     }
 
     /**

+ 19 - 5
src/ChamiloLMS/Controller/BaseController.php

@@ -13,6 +13,9 @@ use Doctrine\ORM\Query;
 use Doctrine\ORM\NoResultException;
 use Silex\Application;
 
+use Symfony\Component\Routing\Annotation\Route;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+
 /**
  * Each entity controller must extends this class.
  *
@@ -57,21 +60,27 @@ abstract class BaseController
      * */
     abstract protected function getTemplatePath();
 
+    /**
+    * Returns the controller alias
+     * @example for QuestionScoreController: question_score_controller
+    */
+    abstract protected function getControllerAlias();
+
     /**
      *
      * @return Request
      */
-    public function getRequest()
+    private function getRequest()
     {
         return $this->get('request');
     }
 
-    public function redirect($redirect)
+    private function redirect($redirect)
     {
         return $this->app->redirect($redirect);
     }
 
-    public function createNotFoundException($message = 'Not Found', \Exception $previous = null)
+    private function createNotFoundException($message = 'Not Found', \Exception $previous = null)
     {
         return $this->app->abort(404, $message);
     }
@@ -95,7 +104,7 @@ abstract class BaseController
      * @param $label
      * @return mixed
      */
-    public function createUrl($label, $params = array())
+    private function createUrl($label, $params = array())
     {
         $links = $this->generateLinks();
         if (isset($links) && is_array($links) && isset($links[$label])) {
@@ -114,7 +123,7 @@ abstract class BaseController
     // CRUD
 
     /**
-     * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+     * @Route("/")
      * @Method({"GET"})
      */
     public function listingAction()
@@ -127,6 +136,11 @@ abstract class BaseController
         return new Response($response, 200, array());
     }
 
+    /**
+     *
+     * @Route("/add")
+     * @Method({"GET"})
+     */
     public function addAction()
     {
         $request = $this->getRequest();

+ 22 - 1
src/ChamiloLMS/Controller/CommonController.php

@@ -40,11 +40,19 @@ class CommonController extends BaseController
     {
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    protected function getControllerAlias() {
+
+    }
+
     /**
      * {@inheritdoc}
      */
     protected function generateLinks()
     {
+        return $this->generateDefaultCrudRoutes();
     }
 
     /**
@@ -54,11 +62,24 @@ class CommonController extends BaseController
     {
     }
 
+    protected function generateDefaultCrudRoutes()
+    {
+        $className = $this->getControllerAlias();
+        return array(
+            'create_link' => $className.':addAction',
+            'read_link' => $className.':readAction',
+            'update_link' => $className.':editAction',
+            'delete_link' => $className.':deleteAction',
+            'list_link' => $className.':indexAction'
+        );
+    }
+
+
     /**
      * @param Application $app
      * @param array $breadcrumbs
      */
-    public function setBreadcrumb(Application $app, $breadcrumbs)
+    protected function setBreadcrumb(Application $app, $breadcrumbs)
     {
         $courseInfo = api_get_course_info();
 

+ 27 - 15
src/ChamiloLMS/Provider/ReflectionControllerProvider.php

@@ -18,33 +18,44 @@ class ReflectionControllerProvider implements ControllerProviderInterface
 {
     private $controllerName;
 
-    function __construct($controllerName)
+    /**
+     * @param string $controllerName
+     */
+    public function __construct($controllerName)
     {
         $this->controllerName = $controllerName;
     }
 
-    function connect(Application $app)
+    /**
+     * @param Application $app
+     * @return \Silex\ControllerCollection
+     */
+    public function connect(Application $app)
     {
         /** @var \Silex\ControllerCollection $controllers */
         $controllers = $app['controllers_factory'];
 
-        //$reflection = new \ReflectionClass($this->class);
         $reflection = new \ReflectionClass($app[$this->controllerName]);
 
         $annotationReader = new AnnotationReader();
         //$classAnnotations = $annotationReader->getClassAnnotations($reflection);
         $routeAnnotation = new Route(array());
         $methodAnnotation = new Method(array());
+
         $methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
 
         foreach ($methods as $method) {
             $methodName = $method->getName();
-            if (in_array($methodName, array('__construct'))) {
+            $controllerName = $this->controllerName.':'.$methodName;
+
+            if (in_array($methodName, array('__construct', 'get', 'getManager'))) {
                 continue;
             }
 
             /** @var Route $routeObject */
             $routeObject = $annotationReader->getMethodAnnotation($method, $routeAnnotation);
+            $req = $routeObject->getRequirements();
+            //$routeObject->setMethods();
 
             /** @var Method $routeObject */
             $methodObject = $annotationReader->getMethodAnnotation($method, $methodAnnotation);
@@ -54,18 +65,19 @@ class ReflectionControllerProvider implements ControllerProviderInterface
                 $methodsToString = implode('|', $methodObject->getMethods());
             }
 
-            $controllers->match($routeObject->getPath(), $this->controllerName.':'.$methodName, $methodsToString);
-        }
+            if ($routeObject) {
+                $match = $controllers->match($routeObject->getPath(), $controllerName, $methodsToString);
+                //var_dump($controllerName);
+                $match->bind($controllerName);
+                // setRequirements
+                if (!empty($req)) {
+                    foreach ($req as $key => $value) {
+                        $match->assert($key, $value);
+                    }
+                }
+            }
 
+        }
         return $controllers;
     }
-
-    private function adjustPath($path)
-    {
-        $path = lcfirst($path);
-        $path = ('index' === $path) ? '' : $path;
-        $path = '/'.$path;
-
-        return $path;
-    }
 }