【发布时间】:2017-02-13 11:32:51
【问题描述】:
我有一些控制器定义为服务,我需要从路由名称中获取控制器的类名。
对于非服务控制器,我可以通过路由器服务获取路由集合:
$route = $this->router->getRouteCollection()->get($routeName);
//Retrieve an object like that:
Route {
-path: "/admin/dashboard"
-host: ""
-schemes: []
-methods: []
-defaults: array:1 [
"_controller" => "AppBundle\Controller\Admin\AdminController::dashboardAction"
]
-requirements: []
-options: array:1 []
-compiled: null
-condition: ""
}
我可以使用$route["defaults"]["_controller"] 访问控制器类名,所以这很好。
问题在于我的控制器作为服务,_controller 属性是服务的名称,而不是控制器类(如app.controller.admin.user:listAction)我有服务的名称,但我需要有类名(AppBundle\Controller\Admin\UserController )
我想出的唯一解决方案是从容器中获取服务并在服务上使用get_class(),但这只会对检索控制器/服务的类产生巨大的性能影响。
还有其他解决办法吗?
【问题讨论】:
-
我相信没有任何其他替代方案会更高效。你需要对类名做什么?
-
我正在尝试复制本教程:trisoft.ro/blog/6-symfony2-advanced-menus,我需要 className 才能读取元数据:$this->metadataReader->loadMetadataForClass(new \ReflectionClass($class));跨度>
-
我想你可以在你的路由中添加一个 _controller_classname 参数。但是需要控制器类名来生成菜单似乎不是理想的设计。
-
我只想在一个地方设置授权。如果我将我的管理网站的报告部分限制为一个角色,我不想复制此配置来为无权访问的人隐藏菜单。上面的解决方案允许我使用 @Security 注释并使用此信息来隐藏我的菜单的特定部分。
-
我认为调用服务并调用 get_class() 是可行的方法,但您可以在此之上添加一个缓存层。
标签: symfony service controller containers