当有斜线时,路由不会起作用

时间:2017-01-21 16:26:24

标签: php annotations symfony

如果我在最后添加/,则无法找到我的路线。

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/quiz/whatever 有效

myurl/quiz 有效

myurl/quiz/ 无效

每当有斜线但后面没有值时,我会收到消息

  

找不到" GET /"

的路线

我是Symfony的新手。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

建议您添加默认值和路径名称,如下所示:

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

然后,如果您使用myurl/quiz/,则会发送myurl/quiz/0。这是一个例子

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

编辑(通过电话)OP评论后:

在控制器操作之前放置2个@Route声明,在没有

的情况下放置一个@Route声明

@Route( “/测验/”)

@Route( “/测验/ {名称}”)

由于OP希望相同的路由控制器同时处理尾部斜杠和非尾部斜杠,因此解决方案是允许Symfony接受斜杠作为变量的一部分(默认情况下不是这样)。

文档:http://symfony.com/doc/current/routing/slash_in_parameter.html

所以你的路线变成了

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按首次匹配获胜的基础匹配路由时,在此自定义之前包括编辑,删除路由。