【问题标题】:Symfony - Generate URL for named route but does not existSymfony - 为命名路由生成 URL 但不存在
【发布时间】:2017-02-08 14:58:38
【问题描述】:

我是 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/”)。 但 URL 生成仅适用于 gb_platform_view

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

我找到调试路由命令行:

php 应用程序/控制台调试:路由器

这是结果。

gb_platform_home 正在清除标识为已知路线,所以我不明白。 此外,您可能会注意到在 shell 中有一个 shifted unique print 用于这条路线。为什么 ?解决的关键?

4个空格编码会是问题吗?

感谢您的帮助。

【问题讨论】:

  • 我认为您需要在路由使用情况中指定page 值。类似return $this->redirectToRoute('gb_platform_home', array('page'=>0));
  • 你能试试那个 dump($this->get('router')->getRouteCollection());并检查 gb_platform_home 路线?
  • Piyush Singh:问题未解决,因为 {page} 已经有默认值。
  • 您可以尝试使用/platform/index/{page} 进行调试。有时,当变量未在路由中明确定义时,路由会将其视为模棱两可。
  • 我知道这是一个愚蠢的问题:但为什么gb_platform_home 行中的字符与其他字符相比略微偏左?看起来不寻常。它是直接这样来的,还是以任何方式编辑的?

标签: php symfony controller routes frameworks


【解决方案1】:

下面的这个解决方案应该可以正常工作。

RequirementDefault value 在生成路由时不会像您预期的那样工作,而是在解析用户输入的 url 时工作

您的控制器需要这样定义:

// 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} 的 url 时触发的规则,您可以根据需要命名路由
  • 第二条规则与第一条规则相同,但我们接受尾部斜杠
  • 生成空路线的第三条规则
/**
 *  @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)
{
}

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2013-07-07
    • 2023-03-11
    • 2018-12-15
    相关资源
    最近更新 更多