【问题标题】:Symfony2 dynamically select controller based on query resultSymfony2 根据查询结果动态选择控制器
【发布时间】:2014-05-26 10:31:32
【问题描述】:

我正在尝试创建一个可扩展的 cms。我的数据库中有 URL,例如“/menu-item/content”,每个 URL 都有一个以“AcmeDemoBundle:Default:index”格式指定的操作。 我想解决此操作并根据匹配的 URL 调用适当的控制器。

我的主要目标是直接调用存储在数据库中的控制器。在我使用一种方法之前,当我将一个路由放在匹配所有 url 的路由的末尾时,将一个控制器与其关联,从数据库中找到目标控制器,而不是使用 Controller::forward() 来获得预期的结果。这种方法的主要问题是我需要为每个页面加载创建一个不必要的子请求。另一个问题是将 post 变量传递给这个新的子请求。

到目前为止,我已尝试监听 kernel.request 事件并修改 $request->attributes 以包含匹配的 _controller 值,但似乎没有效果。

感谢您对该主题的任何建议。

【问题讨论】:

标签: symfony routing


【解决方案1】:

我认为您混淆了转发和重定向调用。 Redirect 执行 301 或 302 重定向(永久和临时),这会创建子请求,正如您所说的那样。 Forward 对新操作执行内部调用(相同的请求)。至于您的第二个问题,由于 forward 是同一请求中的内部调用,因此全局所有内容都保持不变(包括 POST 变量)。在我看来,使用 forward 对您来说可能是一个很好的解决方案(如果您没有任何其他低级要求,或者如果您想要比通常的 MVC 操作允许的更灵活)。

希望这会有所帮助。

【讨论】:

  • 对不起,你错了。转发创建一个子请求。请参阅:symfony.com/doc/current/book/controller.html#forwarding 在转发时仅保留 GET 变量,尽管超全局 $_POST 保持不变,但传递给目标操作的请求对象仅包含 get 变量。
  • 我们读的是同一个东西吗? 您还可以使用 forward() 方法轻松地在内部转发到另一个控制器。它不是重定向用户的浏览器,而是发出一个内部子请求,并调用指定的控制器。 forward() 方法返回从该控制器返回的 Response 对象: 这意味着它在服务器上重定向,而不是在浏览器上。
  • 是的,我对帖子的价值观有误。但在我的情况下,不需要进行内部子请求。我想避免这种情况。
  • 哦,那样的话就更复杂了。您是否考虑过重新实现自己的匹配器?您可以覆盖现有的或实施全新的。更有趣的部分是将它作为服务注册到 DI 中,以便它正确地注入到路由服务中。我想你应该在配置中更改它的类以指向你自己的实现就足够了。 Here is an example.
  • 好的,所以它似乎没有作为服务注入,但是有一个 config option 设置了 Matcher 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多