Symfony 3 - 未返回参数的默认值

时间:2017-09-17 18:30:49

标签: symfony null routes default-value symfony-3.3

我正在努力学习Symfony,所以我对它很陌生,这可能是一个愚蠢的问题,但仍然无法找到答案。

SETUP

我使用最新版本的Symfony(今天获得)和最新版本的PHP 7.1.9。 我有一个名为“Project”的Symfony项目,其中包含一个包:SSTestBundle。 在“src / SS / BlogBu​​ndle / Resources / config / routing.yml”中,我有以下路线:

ss_blog_home:
    path: /{page}
    defaults: 
        _controller: SSBlogBundle:Discussion:index
        page: 1
    requirements:
        page: \d*

我有一个名为DiscussionController的控制器,具有以下功能:

public function indexAction($page)
{
    if ($page < 1)
    {
        throw new NotFoundHttpException('Page -'.$page.'- not existing.');
    }

    return $this->render('OCPlatformBundle:Advert:index.html.twig');
}

因此,如果我的“page”参数的值无效,我会得到一个404页面,其中包含“Page -X- not existing”消息。如果页码正确,它会显示一个非常基本的模板来表示问候。

问题

如果我使用“localhost / web / Project /”访问我的项目,我收到消息:“页面 - 不存在”。一切似乎工作得很好,除了$ page不等于1但没有任何东西!

如果我使用“localhost / web / Project / 5”访问我的项目,它会显示页面。

如果我使用“localhost / web / Project / 0”访问我的项目,它会显示错误页面,“Page -0- not existing”。

但是!如果我将路线从“/ {page}”更改为“/ test / {page}”并尝试访问“localhost / web / Project / test /”,它会正常工作并显示页面!

只有在我将路由设置为根文件夹时才知道为什么它会为'page'返回null默认值? T_T

4 个答案:

答案 0 :(得分:1)

一些重要结论:

  • 您制作了&#39; page&#39;参数可选(在默认值中使用&#39;页面&#39;的默认值)。这意味着即使您未在请求中发送它,代码也将使用其默认值。因此,访问localhost / web / Project /也应该触发控制器 - 它确实如此。
  • 你提出了这个正则表达式的要求:&#39; \ d * &#39; - 这意味着&#39;页面&#39;甚至可能是一个空字符串或至少一个数字。如果你想解决问题nr 1,你应该使用&#39; \ d + &#39; 。
  • 请记住,路线可以被覆盖,并且定义的第一条路线总是胜利。

答案 1 :(得分:0)

根据有关路由的Symfony 3文档(请参阅here),您应该能够设置默认路由参数,如下所示:

ss_blog_home:
    path: /{page}
    defaults: { _controller: SSBlogBundle:Discussion:index, page: 1 } # this sets the default page number for the route to 1.
    requirements:
        page: '\d+' # this line requires that a digit of length 1 or more is passed in to the route.

答案 2 :(得分:0)

  • 如果我使用“localhost / web / Project /”访问我的项目,我收到消息:“页面 - 不存在”。一切似乎工作正常,除了$ page不等于1但没有任何东西! 因为您要求路由有一个参数,但您没有发送
  • 如果我使用“localhost / web / Project / 5”访问我的项目,它会显示页面。 因为您要发送参数
  • 如果我使用“localhost / web / Project / 5”访问我的项目,它会显示页面。 因为您要发送参数
  • 如果我使用“localhost / web / Project / 0”访问我的项目,它会显示错误页面,并显示“Page -0- not existing”。 因条件
  • 但是!如果我将路由从“/ {page}”更改为“/ test / {page}”并尝试访问“localhost / web / Project / test /”,它可以正常工作并显示页面! 因条件 代码不会查找页面类型,因此您可以发送任何您喜欢的内容并且它可以正常工作

    if($ page&lt; 1) {     抛出新的NotFoundHttpException('Page - '。$ page。' - not existing。'); }

答案 3 :(得分:0)

根据您的捆绑“OCPlatformBundle”的名称,我猜你跟着Openclassroom Symfony tutorial。所以我假设你的路线有一个前缀,并且和我一样遇到同样的问题。起初我也不明白,但是当你为你的路线添加前缀时,我发现它确实是Symfony的限制!