试想一下,我有一个 Controller ,其中包含多个操作。 为了实现每个操作,我必须像这样在 routing.yml 文件中严格定义它:
admin_edit_routes:
pattern: /administrator/edituser
defaults: { _controller: MyAdminBundle:Default:edituser }
admin_add_routes:
pattern: /administrator/adduser
defaults: { _controller: MyAdminBundle:Default:adduser }
我可以有很多这样的页面。我想要实现的是在我的 URI 中定义必要的操作,就像 Kohana 路由一样。 我的意思是,我只想对所有操作使用一条路线: (以下代码无效,仅作为示例)
admin_main_route:
pattern: /administrator/{action}
defaults: { _controller: MyAdminBundle:Default:{action} action:index}
它将所有对/administrator/{anything} 的请求传递到这条路由,然后,根据 uri 中声明的操作,将调用所需的操作。 如果 uri 中没有说明操作,那么我们就会被抛到索引操作。
在 Symfony 2 中是否可以以任何方式实现?如果可以,那么如何实现? 提前致谢。
最佳答案
这样做感觉不对。通过直接通过 GET 方法“即时” 公开您的 Controller API(方法),您的应用程序将面临安全漏洞。这也很容易导致不良行为。
此外,例如,您将如何在 Twig 中生成路线?通过给出与方法名称相关的显式常量?
{{ path('dynamic_route', { 'method': 'addUser' }) }}
这不是 Symfony 的工作方式,也不是它所推荐的。 Symfony 不是 CodeIgniter 也不是 Kohana。您不需要第二个“前端 Controller ”
如果这是一个懒惰的问题,您可以将路由配置切换为 annotations .让 Symfony 自动生成您需要的路由,只需最少的努力。
namespace Acme\FooBundle\Controller;
/**
* @Route("/administrator")
*/
class DefaultController extends Controller
{
/**
* @Route
*/
public function indexAction(Request $request);
/**
* @Route("/adduser")
*/
public function addUserAction(Request $request);
/**
* @Route("/edituser")
*/
public function editUserAction(Request $request);
/**
* @Route("/{tried}")
*/
public function fallbackAction($tried, Request $request)
{
return $this->indexAction($request);
}
}
fallbackAction
方法,将不存在的任何/administrator/*
路由返回到indexAction
内容。
总而言之,我建议不要“即时”直接对方法名称使用动态路由。
另一种方法是创建一个命令,该命令将在执行后生成路由。
关于php - 使用可变操作在 Symfony 2 中定义路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24134805/