php - 使用可变操作在 Symfony 2 中定义路由

标签 php symfony routes

试想一下,我有一个 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/

相关文章:

php - 在 JavaScript 函数中传递 PHP 变量

php - Laravel 中的路由顺序很重要

ruby-on-rails - 在 Rails 中给嵌套路由一个别名

php - 当人们 curl 我的网站时,我如何返回垃圾文本?

php - 在 PHP 中检测轮数?

php - 如何使用我的 Java 代码提供 PHP 的 json 字符串?

php - 将symfony 2.8升级到5.0或更高版本以使mysql 8兼容

symfony - 使用唯一键更新实体 - 插入而不是更新

php - 将 'choice' 选项添加到 'entity' 类型表单字段会使表单无效 -- Symfony2

JavaScript 对象 - 我在访问嵌套多个级别的对象属性数组并将它们组合在一起时遇到问题