【问题标题】:How to get defaults values of route by route name如何通过路由名称获取路由的默认值
【发布时间】:2012-12-25 00:15:39
【问题描述】:

我的路线定义如下。

home:
    pattern: /index/index/{show}
    defaults: { _controller: MyBundle:MyIndex:mypage, show: all }
    requirements:
        show:  activeonly|all
        name: ".+"

我想在控制器中做的是, $this->forward ('home', array('show', 'activeonly');

我找不到任何可能的地方。环顾四周,我得到了以下问题和答案。

Symfony 2: How to get route defaults by route name? 。但是给出(接受)的解决方案不起作用。这是因为,默认值作为对象的私有值返回,无法读取。

很高兴知道,我是否可以通过名称读取路由的 _defaults 值并使用该值进行转发?

【问题讨论】:

  • 你为什么不直接调用没有参数的路由,因为你使用默认值?
  • forward 不适用于路由名称。正如我在下面提到的,我不能使用重定向(我可以使用路由器名称),参数是动态的值和数字等等(最多 15 个)。

标签: symfony


【解决方案1】:

在你的控制器内部使用:

$defaults = $this->get('router')->getRouteCollection()->get('home')->getDefaults();

获取 'home' 路由的默认值。

不要通过其属性 _defaults 访问默认值,而是使用 getter Route::getDefaults()

Symfony2 API: Symfony\Component\Routing\Route::getDefaults()

但正如名称“默认值”所述,您不必在使用该路由时指定它们,因为默认情况下会选择它们。因此,如果您想转发到您的 home 路由,只需使用:

$this->forward('MyBundle:MyIndex:mypage');

编辑

这真的很慢,因为::getRouteCollection() 不使用任何缓存,调用它会导致磁盘读取和路由编译非常耗时。

我已经回答了另一种方法here (Symfony 2: How to get route defaults by route name?)。但请注意:据我所知,使用官方 Symfony API 仍然无法有效地做到这一点。如果你真的需要快速完成,你需要破解它。

【讨论】:

  • 非常感谢。这正是我所缺少的
  • 警告:使用getRouteCollection() 会破坏你的表现,github.com/symfony/symfony/issues/11171 因为它不会缓存生成的路由
  • @WiR3D 你说得对,我差点忘了这个答案。 2017 年,我在另一个问题中再次回答了这个问题(这个问题比这个问题更老,但问的是完全相同的问题):stackoverflow.com/questions/9316222/… - 底线:使用 Symfony API 不可能有效地做到这一点,如果你真的需要这样做,你仍然需要破解它。
【解决方案2】:

您必须将forward 与控制器名称一起使用,而不是与路由一起使用。

例如:

如果你想要一个特定的值:

$this->forward ('MyBundle:MyIndex:mypage', array('show' =>'activeonly'));

如果你想要默认值:

$this->forward('MyBundle:MyIndex:mypage');

如果要使用路由,请改用redirect

$this->redirect($this->generateUrl('home'));

一些信息here

【讨论】:

  • 非常有效的点GreenLeaf。但我不能做重定向原因,路由也可以使用 POST 方法。当我进行实验时,在我看来我可以使用 this->forward ('MyBundle\Controller\MyIndexController::mypageAction', array ('show' => 'activeonly')) 工作,其中第一个参数是 value which来自路由器默认值。我希望,我没有错过任何东西。
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 2013-10-12
  • 2018-05-16
  • 2016-06-16
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多