在Symfony 2中定义一个带有变量动作的路由


Defining a route in Symfony 2 with variable action

想象一下,我有一个包含几个动作的控制器。为了达到每个动作,我必须在路由中严格定义它。像这样的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();
    }
}

我很好奇是否有人有其他的想法:>