想象一下,我有一个包含几个动作的控制器。为了达到每个动作,我必须在路由中严格定义它。像这样的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中没有说明action,那么我们被抛出到索引action。
在Symfony 2中是否有可能,如果有,那么如何实现?提前感谢。
这样做感觉不对。通过GET方法直接"动态地"暴露控制器API(方法),将使应用程序面临安全漏洞。这也很容易导致不必要的行为。
此外,如何在twig中生成路线呢?通过给出与方法名称相关联的显式常量?
{{ path('dynamic_route', { 'method': 'addUser' }) }}
这不是Symfony的工作方式,也不是它的建议。Symfony不是CodeIgniter,也不是Kohana。你不需要第二个"Front Controller"
如果这是一个懒惰问题,你可以将你的路由配置切换到注解。然后让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
内容。
另一种方法是创建一个命令,在执行后生成路由。
好吧,也许这不是最好的方法,但它是有效的。您的dynamicAction
接受action
字符串参数并检查是否存在这样的动作。如果是,则使用params
执行给定的操作。
/**
* Default Controller.
*
* @Route("/default")
*/
class DefaultController extends Controller
{
/**
* @Route("/{action}/{params}", name="default_dynamic")
*/
public function dynamicAction($action, $params = null)
{
$action = $action . 'Action';
if (method_exists($this, $action)) {
return $this->{$action}($params);
}
return $this->indexAction();
}
}
我很好奇是否有人有其他的想法:>