4

我正在尝试实现这个 http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html#more-advanced-loaders

我需要捆绑路由在捆绑注册时自动激活

所以我在路径中创建了这个文件

src/Gabriel\AdminPanelBundle\Routing\AdvancedLoader.php

与内容

<?php
//namespace Acme\DemoBundle\Routing;
namespace Gabriel\AdminPanelBundle\Routing;

use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\RouteCollection;

class AdvancedLoader extends Loader
{
    public function load($resource, $type = null)
    {
        $collection = new RouteCollection();

        $resource = '@GabrielAdminPanelBundle/Resources/config/import_routing.yml';
        $type = 'yaml';

        $importedRoutes = $this->import($resource, $type);

        $collection->addCollection($importedRoutes);

        return $collection;
    }

    public function supports($resource, $type = null)
    {
        return $type === 'advanced_extra';
    }
}

我复制了这个配置

gabriel_admin_panel:
    resource: "@GabrielAdminPanelBundle/Controller/"
    type:     annotation
    prefix:   /superuser

/app/config/routing.yml

并将其粘贴到我自己的配置文件中

/src/Gabriel/AdminPanelBundle/Resources/config/import_routing.yml

问题:

Symfony2 完全忽略了我的 AdvancedLoader.php 文件,我可以在其中放入任何语法错误,并且该站点甚至不会抛出错误,而且 router:debug 也不会显示包内定义的路由,除非我移动配置回原来的 router.yml 文件。

PS:清除缓存不会改变任何东西

编辑:当我添加服务和资源时,出现此错误

FileLoaderImportCircularReferenceException:在“/app/config/routing_dev.yml”中检测到循环引用(“/app/config/routing_dev.yml”>“/app/config/routing.yml”>“.”>“@GabrielAdminPanelBundle/Controller/” >“/app/config/routing_dev.yml”)。

4

1 回答 1

2

看起来你可能错过了这个过程中的一些步骤。

第一个:你定义了服务吗?

services:
    gabriel.routing_loader:
        class: Gabriel\AdminPanelBundle\Routing\AdvancedLoader
        tags:
            - { name: routing.loader }

注意标签。正如文档所说:

注意标签 routing.loader。所有带有此标签的服务都将被标记为潜在的路由加载器,并作为专用路由器添加到 DelegatingLoader。

第二但非常重要,因为正如文档所述,如果您不添加此行,则不会调用您的路由加载器:

# app/config/routing.yml
Gabriel_Extra:
    resource: .
    type: advanced_extra

这里重要的部分是类型键。在您的情况下,它的值应该是“advanced_extra”。这是您AdvancedLoader支持的类型,这将确保调用其 load() 方法。资源键对于 是无关紧要的AdvancedLoader,因此设置为“.”。

我想它现在会被加载。

于 2015-01-21T18:24:34.330 回答