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/”
的路由。