Php 是否在Symfony中具有动态路由的所有控制器中包含相同的操作?

Php 是否在Symfony中具有动态路由的所有控制器中包含相同的操作?,php,controller,symfony,Php,Controller,Symfony,我正在构建一个服务(称为“dynamic_query”),我使用它向REST API公开所有实体,因此,如果我有这样一个实体图: [大陆--(有许多)-->国家--(有许多-->城市] 我可以通过URL获取非洲国家(JSON列表): 即使是间接相关的实体,我仍然可以得到结果: 例如,要列出属于欧洲国家的所有城市: 该服务已准备就绪并经过测试,以下是我如何在城市控制器中使用该服务的示例: /** * City controller. * * @Route("city") */ class Ci

我正在构建一个服务(称为“dynamic_query”),我使用它向REST API公开所有实体,因此,如果我有这样一个实体图:

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

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

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

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

/**
* 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()**及其路由**,并使它在我的包中的每个实体中都可用,这样每当我访问:


除了$entity_name和route name/uri应该动态更改以适应api查询之外,我在apiAction()中得到了与上面所示完全相同的逻辑,除了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+
管理员控制器:

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));


}

它不适用于RESTAPI,但我认为您可以根据自己的情况轻松地修改此代码。但是您需要相互控制器。

听起来您需要某种不在“/city”路径前缀中的全局控制器。在这个控制器中,您可以使用可变部分配置路由,比如方法GET的
/{entity}/api
。然后,使用switch语句或其他语句,根据路由slug获取实体名称,并将dql的FROM部分更改为使用此实体名称。