Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带尾随斜线的Symfony2路由器不一致_Php_Url_Symfony_Redirect_Symfony 2.4 - Fatal编程技术网

Php 带尾随斜线的Symfony2路由器不一致

Php 带尾随斜线的Symfony2路由器不一致,php,url,symfony,redirect,symfony-2.4,Php,Url,Symfony,Redirect,Symfony 2.4,我有一个非常简单的捆绑控制器 <?php namespace Mnab\ContactBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller { public function indexAction($anything) { return new \Symfony\Co

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

<?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));
    }
}
在这种情况下,应用程序接受此控制器的以下URL:

/联系人//contact/bla/contact/bla/bla/bla/bla

等等

案例2此控制器的路由如下所示:

mnab_contact_homepage:
    pattern:  contact/{anything}
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
mnab_contact_homepage:
    pattern:  contact/
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
mnab_contact_homepage:
    pattern:  contact
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
在这种情况下,应用程序只接受

/接触/

如果有url:

/联系人->它将重定向(不知道是301还是302类型)到/contact/url

案例3此控制器的路由如下所示:

mnab_contact_homepage:
    pattern:  contact/{anything}
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
mnab_contact_homepage:
    pattern:  contact/
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
mnab_contact_homepage:
    pattern:  contact
    defaults: { _controller: MnabContactBundle:Default:index, anything: null }
    requirements:
      anything: .*
在这种情况下,应用程序只接受

/接触

预期结果

在案例3中,一切都如我所料,但案例1和案例2的工作方式与我所料不同

问题

  • 为什么在案例1中,应用程序也接受/联系url?我显然期望/联系/url而不是联系/

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

  • 案例1和案例2行为不同的原因

  • 是否有可能改变这种行为?例如,在我的情况下,根本不接受/联系?(事实上,我不介意,因为我想要一些带有尾随斜杠的URL,但在案例1中,我必须为没有尾随斜杠的版本执行重定向)

  • Symfony是否对所有URL(也有扩展名,例如我定义它适用于/test.html,Symfony使它也适用于/test.html/)或仅适用于那些没有扩展名的URL

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

  • 为什么在案例1中,应用程序也接受/联系url?我很清楚 expect/contact/url not contact/

    /contact
    表示您省略了
    任何
    参数,该参数在本例中为
    null

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

    为什么案例2中的应用程序也接受/联系url制作 将其重定向到/联系/

    这是一种行为,实在无法多说

    案例1和案例2行为不同的原因

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

    是否有可能改变这种行为?例如,在 我的情况下的所有/联系方式

    是,例如,将
    anything
    参数设置为强制参数,而不是可选参数

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

    路由组件的行为是一致的,无论是使用
    test
    还是
    test.html

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

    关于这方面的源代码不多,但您可以随时查看的源代码


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

    看看这个,我今天看到了这个,也看到了这个技巧,但我需要“黑客”才能让它工作,但我仍然不明白为什么在两种情况下Symfony的行为不同,因为模式不同,我希望sf2在模式中支持正则表达式,以便澄清,每次当我有具有类似路由联系人/{anything}的控制器时,任何内容都是可选的,Symfony2认为斜杠也是可选的,因为它被视为参数分隔符,当url中没有第二个参数时,Symfony2认为在这种情况下斜杠是不必要的。这样行吗?@MarcinNabiałek是的,对。对于您的URL“/contact/{anything}”适用:如果有“/contact”=没有参数并且默认值已分配给该参数,如果有“/contact/”-应为参数值,否则将引发异常。