无法获取路由 Symfony

Posted

技术标签:

【中文标题】无法获取路由 Symfony【英文标题】:Cannot Get Route Symfony 【发布时间】:2017-08-24 10:00:50 【问题描述】:

正如标题明确指出的那样,我无法获得最近添加的某些特定路线。 我的 symfony 版本:2.8.18。 所以这里是细节:

我尝试匹配的路线: - /平台/猫 - /platform/cat/id

文件 - app/config/routing.yml

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

文件 - GB\PlatformBundle\Resources\config\routing.yml

    gb_platform_home_:
    path :   /
      defaults:  _controller: GBPlatformBundle:Advert:index 

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+

gb_platform_add:
    path :   /add
    defaults:  _controller : GBPlatformBundle:Advert:add 

gb_platform_edit:
    path :   /edit/id
    defaults:  _controller : GBPlatformBundle:Advert:edit 
    requirements:
        id: \d+

gb_platform_delete:
    path :   /delete/id
    defaults:  _controller : GBPlatformBundle:Advert:delete 
    requirements:
        id: \d+

gb_platform_cat:
    path :   /cat
    defaults:  _controller : GBPlatformBundle:Category:index 

gb_platform_cat_view:
    path : /cat/id
    defaults:  _controller : GBPlatformBundle:Category:view 
    requirements:
        id: \d+

文件 - GB\PlatformBundle\Resources\controller\CategoryController.php

    <?php

namespace GB\PlatformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\Response;

use GB\PlatformBundle\Entity\Advert;
use GB\PlatformBundle\Entity\Category;

class CategoryController extends Controller

    public function indexAction(Request $request)
    

    

    public function viewAction($id)
    
        $em = $this->getDoctrine()->getManager();
        $catRepo = $em
            ->getRepository('GBPlatformBundle:Category');
        $cat = $catRepo
            ->find($id);

        if($cat === null)
        
            throw new NotFoundHttpException("L'annonce d'id ".$id." n'existe pas.");
        

        return $this->render('GBPlatformBundle:Category:view.html.twig', array(
            'category' => $cat,
            ));
    

在源头,bundle 的 routing.yml 是无效的。修复后,我尝试获取这两个命令:

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

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

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

每个命令都成功了,我看到 /cat 和 /add 之间没有区别,而一个匹配而另一个不匹配。 我也尝试过多次清除缓存:

php 应用程序/控制台缓存:清除 --env prod

还是不行。我糊涂了 ... 错误是基本的:找不到“GET /platform/cat/7

的路由”

【问题讨论】:

您说您的路由文件是GB\PlatformBundle\Ressources\config\routing.yml,请注意您使用的是“资源”而不是您的routing.yml 中的资源:@​​987654328@。是这个问题吗? 确实是我的错。这是特定于主题的输入错误。 尝试更正 routing.yml 开头的 4 个空格:gb_platform_home_: 可能是另一个输入错误,但它可能会出错。 Yaml 对空格非常严格。 我很小心,又检查了一遍。没有错误。我什至将其提交给:yamllint.com。我认为,问题可能是 rounting.yml 没有按应有的方式实现。我试图更改匹配路由的控制器,它使用旧控制器... gb_platform_home 路线中的另一个错字打开和关闭:_controller : GBPlatformBundle:Advert:index 【参考方案1】:

你定义了 /cat/7 而不是 /platform/cat/7

无论如何,在控制器中使用注释而不是路由文件会更好:

/**
 * @Route("/platform/cat/id", name="gb_platform_cat_view")
 */
public function viewAction($id)


    $em = $this->getDoctrine()->getManager();
    $catRepo = $em
        ->getRepository('GBPlatformBundle:Category');
    $cat = $catRepo
        ->find($id);

    if($cat === null)
    
        throw new NotFoundHttpException("L'annonce d'id ".$id." n'existe pas.");
    

    return $this->render('GBPlatformBundle:Category:view.html.twig', array(
        'category' => $cat,
        ));

【讨论】:

/platform 在 app/config/routing.yml 中被定义为默认前缀。 debug:router 查看最近加入的图片。 这完全取决于是否有人使用带注释的路由,在是否使用方面存在巨大分歧,双方都有一百万种不同的原因。此外,就目前而言,您的示例不会帮助 OP,因为您没有告诉他如何从 yml 更改为注释,您需要告诉配置。【参考方案2】:

根据docs,您需要在模式周围加上引号才能满足要求。

gb_platform_cat_view:
    path : /cat/id
    defaults:  _controller : GBPlatformBundle:Category:view 
    requirements:
        id: '\d+'

【讨论】:

感谢您的回答,但并没有解决问题。顺便说一句,所有其他路由都匹配,除了带有'/cat'的路由,而用于需求的格式是相同的。【参考方案3】:

我终于明白了。

首先要确定 routing.yml 文件的有效性。 除了通常的 symfony 命令(它会提示您错误)之外,您还可以使用如下验证器:yamllint.com

就我而言,路由配置是正确的。我知道 symfony 可以通过 debug:router 命令找到它们并将它们与其他功能路由进行比较。

我注意到,即使更改了可以匹配的路由控制器,系统也没有考虑更新。很明显,这是一个缓存问题。

在真正开始时,我使用命令来拒绝这个假设:

php 应用程序/控制台缓存:清除 --env prod

但是这个问题比生产环境更具全局性,所以我在没有指定环境的情况下解决了我的问题:

php 应用程序/控制台缓存:清除

这种错误你犯了一次,但不是两次,所以它是.. ;)

【讨论】:

以上是关于无法获取路由 Symfony的主要内容,如果未能解决你的问题,请参考以下文章

无法从角度路由器获取路径或URL

无法获取路由 Symfony

NODE 无法获取路由功能

小米路由器mini丢失SN无法获取root权限怎么办

尝试测试获取所有路由时出现“TypeError:无法读取 null 的属性 '1'”?

REST api/postman - 无法获取/路由错误