Symfony - 为命名路由生成URL但不存在

时间:2017-02-08 14:58:38

标签: php symfony controller routes frameworks

我是Symfony的新手。当前版本:2.8.16 我的问题:我不管理重定向。

app / config / routing.yml

gb_platform:
resource: "@GBPlatformBundle/Resources/config/routing.yml"
prefix:   /platform

src / GB / PlatformBundle / Ressources / config / routing.yml

gb_platform_home:
path :   /{page}
defaults: 
    _controller : GBPlatformBundle:Advert:index
    page: 1
requirements:
    page: \d*

gb_platform_view:
path :   /advert/{id}
defaults: { _controller : GBPlatformBundle:Advert:view }
requirements:
    id: \d+

src / GB / PlatformBundle / Controller / AdvertController.php

namespace GB\PlatformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;

class AdvertController extends Controller
{
    public function indexAction()
    {
        $url = $this->get('router')->generate(
            'gb_platform_view',
            array( 'id' => 5)
            );
        return new Response("L'url de l'annonce d'id 5 est : ". $url);
    }

    public function viewAction($id)
    {
        return $this->redirectToRoute('gb_platform_home');
        //return new Response("lol");
    }
}

错误如下:

  

无法为指定路由“gb_platform_home”生成URL,因为此路由不存在。

我可以手动访问两个路径(可以到达“app_dev.php / platform /”)。 但是,网址生成仅适用于 gb_platform_view

我认为问题的根源可能在app / config / routing.yml文件中指定没有迭代...但是如果我这样做它并没有解决任何问题,似乎会​​产生更多问题。

我找到调试路由命令行:

  

php app / console debug:router

结果如下。

 Screenshot shell debug router

gb_platform_home正在清除识别路线,所以我不明白。 此外,您可能会注意到shell中的此路由有移位的唯一打印。为什么?解决的关键?

4个空格编码可能是问题吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

下面的解决方案可以按预期工作。

RequirementDefault value在生成路线时无法正常工作,而是在解析用户输入的网址时

你的控制器需要像这样定义:

// you must set the default value like that `$page = 1`
function indexAction(Request $request, $page = 1) 
gb_platform_home:
  path :   /{page}
  defaults: 
    _controller: GBPlatformBundle:Advert:index
    page: 1
  requirements:
    page: \d*
gb_platform_home_: <------ use it to generate your empty route
  path :   /
  defaults: { _controller: GBPlatformBundle:Advert:index }

我更喜欢使用路线作为注释的原因

  • 当我们收到带有{page}的网址时会触发第一条规则,您可以根据需要为路线命名
  • 第二条规则与第一条规则相同,但我们接受尾部斜线
  • 生成空路线的第三条规则
/**
 *  @Route("/platform/{page}", requirements={"page": "\d*"} ,defaults={"page":1})
 *  @Route("/platform/{page}/", requirements={"page": "\d*"}, defaults={"page":1}) 
 *  @Route("/platform", name="gb_platform_home")
 */
function indexAction(Request $request, $page = 1)
{
}