在Symfony中使用动态路由在所有控制器中包含相同的操作?

时间:2017-02-17 16:48:21

标签: php controller symfony

我正在构建一个服务(称为“dynamic_query”),我用它来将所有实体公开给REST API,这样如果我有一个像这样的实体图:

[大陆 - (有很多) - >国家 - (有很多) - >城市]

我可以通过网址获取非洲国家(JSON列表):

http://www.example.com/country/api/?continent=africa

即使对于间接相关的实体,我仍然可以得到结果: 例如,列出属于欧洲国家的所有城市:

http://www.example.com/city/api/?continent=europe

该服务已准备就绪并经过测试,以下是我在城市控制器中使用它的方式:

/**
* City controller.
*
* @Route("city")
*/
class CityController extends Controller
{
    /**
     *
     * @Route("/api/", name="city_api",options = { "expose" = true })
     * @Method("GET")
     * 
     */
     public function apiAction(Request $request)
     {

        $conditions=$request->query->all();

        $results=$this->get("app.dynamic_query")
                      ->narrow("city",$conditions);

        return new Response($results);
      }
}

我现在正在寻找的方法是找到一种方法来“重复”这个 apiAction() **及其路径**并使其在我的捆绑包中的每个实体中都可用,所以无论何时我访问:

http://www.example.com/entity/api/?arg_1=val_1&arg_2=val_2&arg_n=val_n

我在apiAction()中显示了完全相同的逻辑,除了$ entity_name和路由名称/ uri应该动态改变以适应api查询

1 个答案:

答案 0 :(得分:1)

除了mickadoo评论之外,就我而言,这就是我用来做的事情:

的routing.yml:

list_entities:
    path:     /admin/list/{class}/{page}
    defaults: { _controller: AdminBundle:Admin:listEntities, page : 1 }
    requirements:
        methods:  GET
        class: region|department|city|user|type|category|offer|report|comment
        page: \d+

AdminController:

class AdminController extends Controller{

    private $entities_bundle = array('region' => 'LocalizationBundle',
                                    'department' => 'LocalizationBundle',
                                    'city' => 'LocalizationBundle',
                                    'user' => 'MainBundle',
                                    'type' => 'MainBundle',
                                    'category' => 'MainBundle',
                                    'offer' => 'MainBundle',
                                    'report' => 'MainBundle',
                                    'comment' => 'MainBundle');

    private $entity_entities = array('region' => 'regions',
                                    'department' => 'departments',
                                    'city' => 'cities',
                                    'user' => 'users',
                                    'type' => 'types',
                                    'category' => 'categories',
                                    'offer' => 'offers',
                                    'report' => 'reports',
                                    'comment' => 'comments');

...

public function listEntitiesAction($class, $page = 1){

    $em = $this->getDoctrine()->getManager();
    $entities = $em->getRepository($this->entities_bundle[$class].":".ucfirst($class))->findPaginateListForAdmin(30, $page);

    //Your logic

    return $this->render('AdminBundle:Admin:list_'.$this->entity_entities[$class].'.html.twig', array('parameters' => $parameters));


}

它不适用于REST API,但我认为您可以根据自己的情况轻松调整此代码。但是你需要相互控制。