如何覆盖在Symfony2中扩展Controller的路由

时间:2014-07-19 14:55:43

标签: symfony routes symfony-2.3 extends

我创建了一个BaseController来进行通用的REST Api调用,但在某些情况下,我需要对其进行扩展并更改一些代码。

class BaseController extends Controller {

    /**
     * @Route("/api/{entity_name}")
     * @Method({"GET"})
     * @Template()
     */
    public function indexAction($entity_name) {
        $inflector = new Inflector();
        $class_name = ucfirst($inflector->camelize($entity_name));

        $entities = $this->getDoctrine()->getManager()->getRepository('AppApiBundle:' . $class_name)->findAll();
        $serializer = $this->get('jms_serializer');
        return new JsonResponse($serializer->serialize($entities, 'json'), 200);
    }

    /**
     * @Route("/api/{entity_name}/{id}")
     * * @Method({"GET"})
     * @Template()
     */
    public function getAction($entity_name, $id) {
        $inflector = new Inflector();
        $class_name = ucfirst($inflector->camelize($entity_name));

        $entitiy = $this->getDoctrine()->getManager()->getRepository('AppApiBundle:' . $class_name)->find($id);
        $serializer = $this->get('jms_serializer');
        return new JsonResponse($serializer->serialize($entitiy, 'json'), 200);
    }

    /**
     * @Route("/api/{entity_name}")
     * @Method({"POST"})
     * @Template()
     */
    public function postAction($entity_name) {
        return array(
                // ...
        );
    }

    /**
     * @Route("/api/{entity_name}/{id}")
     * @Method({"PUT"})
     * @Template()
     */
    public function putAction($entity_name, $id) {
        return array(
                // ...
        );
    }

    /**
     * @Route("/api/{entity_name}/{id}")
     * @Method({"DELETE"})
     * @Template()
     */
    public function deleteAction($entity_name, $id) {
        return array(
                // ...
        );
    }

}



    class CountryController extends BaseController {

    /**
     * @Route("/api/country")
     * @Method({"GET"})
     * @Template()
     */
    public function getAllAction() {
        /**
         * Another business rules here
         */
        return array();
    }
}

然后,如果我调用"/api/country" Symfony2调用BaseController的"/api/{entity_name}"路由而不是覆盖路由CountryController的"/api/country"

有人知道如何解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

Symfony按照遇到的顺序检查路线。您需要更改路由配置文件中条目的顺序。

或者,在您的@Route注释中添加一个需求参数,将'country'排除在可能的匹配范围之外。