Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.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 路由赢得';后面有一条斜线时,我就不工作了_Php_Annotations_Symfony - Fatal编程技术网

Php 路由赢得';后面有一条斜线时,我就不工作了

Php 路由赢得';后面有一条斜线时,我就不工作了,php,annotations,symfony,Php,Annotations,Symfony,如果在末尾添加/,则无法找到我的路线,如下所示 class QuizController extends Controller { /** * @Route("/quiz/{name}") */ public function showAction($name = '') { $templating = $this->container->get('templating'); $html = $templating-

如果在末尾添加
/
,则无法找到我的路线,如下所示

class QuizController extends Controller {
    /**
     * @Route("/quiz/{name}")
     */
    public function showAction($name = '') {
        $templating = $this->container->get('templating');
        $html = $templating->render('quiz/show.html.twig', [
            'name' => $name,
            'title' => 'Hello World'
        ]);

        return new Response($html);
    }
}
问题是:

myurl/quick/which
有效

myurl/quick
有效

myurl/quick/
不起作用

只要后面有斜杠但没有值,我就会得到消息

找不到“GET/”的路由


我是新来的。如何修复此问题?

使用
myurl/quitch
表示未使用
{name}
参数,但使用
myurl/quitch/
时,需要传入
{name}
参数

建议您为管线添加默认值和名称,如下所示:

/**
 * @Route("/quiz/{name}")
 *      defaults={"name" = 0},
 *      name="quiz")
 */

然后,如果您使用
myurl/quick/
它将发送
myurl/quick/0
。这是一个示例

在路由声明中添加结束斜杠,不带/的路由将自动重定向到带/

class QuizController extends Controller
{
    /**
     * @Route("/quiz/{name}/")
     */
    public function showAction($name = '')
    {
        $templating = $this->container->get('templating');
        $html = $templating->render('quiz/show.html.twig', [
            'name' => $name,
            'title' => 'Hello World'
        ]);

        return new Response($html);
    }
}
在以下OP评论后编辑(通过电话):

在控制器操作之前放置2个@Route声明,一个带斜杠,一个不带斜杠

@路线(“/quick/”)

@路由(“/quick/{name}”) 由于OP希望同一路由控制器同时处理尾随斜杠和非尾随斜杠,因此解决方案是允许Symfony接受斜杠作为变量的一部分(默认情况下不接受)

此处的文档:

所以你的路线变成了

class QuizController extends Controller {
    /**
     * @Route("/quiz{name}", name="quiz_name", requirements={"name"=".+"})
     */
    public function showAction($name = '') {
        $templating = $this->container->get('templating');
        $html = $templating->render('quiz/show.html.twig', [
            'name' => $name,
            'title' => 'Hello World'
        ]);

        return new Response($html);
    }
}
请注意:虽然这回答了OP的问题,但这是一种危险的做法。对于任何阅读本文的人来说,它可能适合OP的逻辑,但请注意,它也将匹配任何路线

/quiz*
所以,虽然OP想要这个,但它也会匹配

/quiz/name
/quiz/
/quiz
/quiz/name/edit
/quiz/name/delete

对于OP,一个解决办法是在自定义路由之前包含编辑、删除路由,因为Symfony会根据第一场比赛的胜负来匹配路由。

视情况而定,是否希望相同的路由同时匹配尾随和非尾随斜杠?@DonOmondi是的,因此
myurl/quick/
的工作原理应该与
myurl/quick
@RezaSaadati相同,在这种情况下,我现在给你写一个解决方案:)谢谢你的回答。在这种情况下,当我在模板中使用
{{name}
时,输出将是
/
。我不希望
/
成为参数
名称
的值。我想要的是页面
myurl/quick
可以在末尾使用或不使用
/
进行访问。我不确定,但我认为这是一个配置问题。@Reza,不幸的是,它没有那么简单。您必须了解路由如何与控制器操作匹配。默认设置是匹配任何静态字符串(例如测验),然后使用/作为url分隔符。为了获得更好的功能,大多数人将所有尾随/重定向到不带尾随,然后使用/作为分隔符。作为最后的手段,你可以使用上面的解决方案。问题是,机器还不是智能的,所以,虽然它对人类来说可能听起来很简单,但如果没有帮助,它无法知道你想要什么。对于您的解决方案,我看到的唯一出路是复制路由(两条路由可以匹配同一个控制器),我回到PC后会发布一个解决方案。这将在参数
name
后添加斜杠,但在
quick
后不会添加斜杠。基本上,如果
quick
后面有一个斜杠,并且
name
没有参数,它应该重定向回
myurl/quick
。这对我不起作用。它返回
未找到“GET/quick/”
的路由。