【问题标题】:Check url before redirect symfony2在重定向 symfony2 之前检查 url
【发布时间】:2012-12-17 16:07:56
【问题描述】:
if ($u = $this->generateUrl('_'.$specific.'_thanks'))
  return $this->redirect($u);
else
  return $this->redirect($this->generateUrl('_thanks'));

_specific_thanks 存在时,我不想重定向到它。那么如何判断一个url是否存在呢?

当我这样做时,我遇到了这个错误:

路线“_specific_thanks”不存在。

【问题讨论】:

    标签: php symfony routing


    【解决方案1】:

    我认为没有直接的方法可以检查路线是否存在。但是你可以通过router服务寻找路由是否存在。

    $router = $this->container->get('router');
    

    然后您可以获得一个路由集合并为给定的路由调用get(),如果它不存在则返回null。

    $router->getRouteCollection()->get('_'. $specific. '_thanks');
    

    【讨论】:

    • 完美它对我有用!只需 $this->container->get('router'); 使用 symfony 2.1.4
    • 太棒了!我更新了答案,使其适合 sf 2.1.4 :) 我认为 $this->get('router') 也可以。
    【解决方案2】:

    在运行时使用getRouteCollection() 不是正确的解决方案。执行此方法将需要重建缓存。这意味着路由缓存将根据每个请求重新构建,从而使您的应用程序比需要的慢得多。

    如果要检查路由是否存在,请使用 try ... catch 构造:

    use Symfony\Component\Routing\Exception\RouteNotFoundException;
    
    try {
        dump($router->generate('some_route'));
    } catch (RouteNotFoundException $e) {
        dump('Oh noes, route "some_route" doesn't exists!');
    }
    

    【讨论】:

      【解决方案3】:

      试试这样,检查路由是否存在于所有路由的数组中:

          $router = $this->get('router');
      
          if (array_key_exists('_'.$specific.'_thanks',$router->getRouteCollection->all())){
              return $this->redirect($this->generateUrl('_'.$specific.'_thanks'))
          } else {
              return $this->redirect($this->generateUrl('_thanks'));
          }
      

      【讨论】:

      • 太快了。但不是in_array('',array_keys()) 你可以只做if (array_key_exists('_'.$specific.'_thanks',$router->getRouteCollection()->all())
      • @AlainTiemblo 我不确定它是否真的是性能杀手,@ahmedSiouani 的解决方案更简洁,但代码的作用几乎相同,只是 isset 而不是 array_key_exists。请参阅 github.com/symfony/symfony/blob/2.8/src/Symfony/Component/… 了解 all 的工作原理。真正的性能杀手是getRouteCollection,因为它会加载尚未加载的路由。 github.com/symfony/symfony/blob/2.8/src/Symfony/Component/… 这在项目中给我们带来了一些实际的性能问题:)
      • 是的,我同意getRouteCollection 是这里最昂贵的东西,但是->all() 确实会返回数组中的每条路线,如果您的网站很大,请根据语言环境和其他任何方式翻译路线,这将是一个大数组,并且在内存/速度方面很昂贵。顺便说一句,我希望大型网站永远不需要使用这样的技巧:)。
      【解决方案4】:

      你检查你的演员了吗? 你确定路线吗?通常路线以

      开头
      'WEBSITENAME_'.$specific.'_thanks'

      【讨论】:

        【解决方案5】:

        试试这个:

        if ($u == $this->generateUrl('_'.$specific.'_thanks') )
        

        【讨论】:

        • 真不知道这样能解决什么问题……你真的看懂代码了吗?
        • 我没有使用 symfony2 的经验。我在 if 条件下看到他分配了一个任务,所以我认为这可能是问题所在。我不知道 $this->generateUrl() 函数返回什么。
        • 您是否看到在条件内部使用了赋值?所以使用=== 删除分配...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多