【问题标题】:Include the same action in all controllers with a dynamic route in Symfony?在 Symfony 中具有动态路由的所有控制器中包含相同的操作?
【发布时间】:2017-02-17 16:48:20
【问题描述】:

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

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

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

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

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

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

该服务已经准备好并经过测试,这里以我在 City Controller 中的使用方式为例:

/**
* 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 查询

【问题讨论】:

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

标签: php controller symfony


【解决方案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+

管理员控制器:

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,但我认为您可以根据自己的情况轻松调整此代码。但是你需要相互控制器。

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多