【问题标题】:Symfony2 router incosistency with trailing slashSymfony2 路由器与斜杠不一致
【发布时间】:2014-06-22 05:13:04
【问题描述】:

我有一个非常简单的捆绑控制器

<?php

namespace Mnab\ContactBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction($anything)
    {
        return new \Symfony\Component\HttpFoundation\Response(__CLASS__ .' '.$anything);
        //return $this->render('MnabContactBundle:Default:index.html.twig', array('name' => $anything));
    }
}

我在 YML 文件中有 roter 配置

案例 1:我的这个控制器的路由如下:

mnab_contact_homepage:
    pattern:  contact/{anything}
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序接受此控制器的以下网址:

/contact /contact/ /contact/bla /contact/bla/bla/blabla

等等

案例 2 我的这个控制器的路由如下:

mnab_contact_homepage:
    pattern:  contact/
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序只接受

/联系人/

如果有网址:

/contact -> 它使重定向(不知道 301 或 302 是什么类型)到 /contact/ url

案例 3 我的这个控制器的路由如下:

mnab_contact_homepage:
    pattern:  contact
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*

在这种情况下,应用程序只接受

/联系方式

预期结果

在案例 3 中,一切都如我所料,但案例 1 和 2 却不像我所期望的那样工作

问题

  1. 为什么在 案例 1 应用程序也接受 /contact url ?我显然期望 /contact/ url 不是联系人/

  2. 为什么在 案例 2 应用程序也接受 /contact url 将其重定向到 /contact/

  3. 为什么 case 1case 2

  4. 的行为不同
  5. 是否可以改变这种行为 - 例如在我的情况下根本不接受 /contact ? (事实上​​我不介意,因为我想要一些带有斜杠的网址,但在 case 1 中,我必须为不带斜杠的版本进行重定向)

  6. Symfony 是否为所有 url 做这样的“技巧”(也有扩展名,例如我定义它适用于 /test.html 并且 Symfony 使它也适用于 /test.html/ )或只适用于那些没有扩展名?

  7. 我在哪里可以阅读更多关于此类案例的信息?

【问题讨论】:

  • 看看这个answer
  • 我今天看到了这个并看到了这个技巧,但它对我来说相当“hack”来使它工作,但我仍然不明白为什么在 2 种情况下 Symfony 的行为不同
  • 表现不同,因为模式不同,我希望 sf2 在模式中支持正则表达式

标签: php url symfony redirect symfony-2.4


【解决方案1】:

为什么 1 应用程序也接受 /contact url?我已经清楚 期望 /contact/ url 不是联系人/

/contact 表示您将省略anything 参数,在本例中为null

/contact/ 表示您不会遗漏anything 参数。在这种情况下应该抛出NotFoundHttpException,因为您没有为anything 参数提供任何值。

为什么如果 2 应用程序也接受 /contact url 制作 将其重定向到 /contact/

这是Symfony2 routing component的行为,真的不能说更多了。

为什么案例 1 和案例 2 的行为不同

因为在情况 1 中路由中有参数。该参数虽然有一个默认值。情况2,路由中没有参数。

是否可以改变这种行为 - 例如不接受 在我的情况下全部/联系人

是的,例如将anything 参数设为必填,而非可选。

Symfony 是否对所有 url 做这样的“技巧”(也有扩展名为 for 例如,我定义它适用于 /test.html,Symfony 使它工作 也适用于 /test.html/ )或仅适用于没有扩展名的人

路由组件的行为是一致的,不管你用test还是test.html

我在哪里可以阅读更多关于此类案例的信息?

这方面的资料不多,但你可以随时查看routing component的源代码。

但是,路由组件的文档可以在这里找到Routing

【讨论】:

  • 所以澄清一下,每次当我有类似路由的控制器时,contact/{anything} 并且任何东西都是可选的,Symfony2 认为斜线也是可选的,因为它被视为参数分隔符并且没有第二个url symfony2 中的参数认为在这种情况下不需要斜线。是这样的吗?
  • @MarcinNabiałek 是的,正确的。对于您的 URL “/contact/{anything}” 适用:如果有“/contact” = 没有参数并且为参数分配了默认值,如果有“/contact/” - 预期参数值,否则抛出异常.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2012-08-02
  • 1970-01-01
  • 2012-04-05
  • 2019-05-22
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多