Symfony2 捆绑包继承丢失父捆绑包路由

2022-08-30 16:09:46

我正在尝试按照此处的说明创建一个简单的捆绑继承,并遇到了路由问题。我正在使用注释进行路由。当我在 AppKernel 中注册我的子捆绑包时.php我的所有父捆绑包路由都丢失了。

对于我从文档中了解到的情况,Symfony2应该首先从子捆绑包中查看所有文件,包括路由,然后再从父捆绑包中查找。现在没有发生这种情况,似乎只加载了子捆绑包控制器。

在我的子捆绑包文件中,我已经按照指示实现了getParent函数,在我的ting.yml中,我有:

ParentBundle:
resource: "@Parent/Controller/"
type:     annotation
prefix:   /admin/

这在继承之前工作得很好。

我已经测试过,如果在 routeing.yml 中单独包含所有控制器文件,系统可以正常工作,但这似乎是使继承工作非常麻烦的方法,因为我只想覆盖父捆绑包的几个部分(不是所有控制器)。

Profiler 将我的两个捆绑包显示为活动状态。


答案 1

我找到了这个问题的正确解决方案。今天,我还尝试覆盖配置了注释路由的父捆绑包,还发现如果注释路由导入了整个捆绑包(“@SomeBundle/控制器”),则父路由将被忽略。

经过一些调试,我发现对此的解释是,如果您使用“@”作为控制器的前缀,这将传递给内核解析器,如果父资源已被覆盖,内核解析器将仅返回子资源。因此,解决方案是提供捆绑包的完整路径,考虑到内核将尝试匹配来自 app/Resources 的资源,因此您必须添加一个相对目录 (../../) 在实际路径之前:

# app/config/routing.yml:
some_parent:
    resource: "../../src/Application/ParentBundle/Controller"
    type: annotation

# ChildBundle implements getParent() method to inherit from ParentBundle
some_child:
    resource: "@ChildBundle/Controller"
    type: annotation

这将按预期工作:所有父路由都将被导入,并将被子捆绑包中指定的所有路由覆盖。


答案 2

除了之前的答案之外,我还必须更改子捆绑包的路由.yml的名称(例如,更改为routing_child.yml)才能使其正常工作。我假设这是因为如果名称相同,Symfony完全忽略父捆绑包路由文件。

编辑:在许多情况下,将父捆绑路由导入子捆绑路由文件也是可行的,如下所示:

# routing_child.yml     
_parent:
    resource: "@MyParentBundle/Resources/config/routing.yml"

推荐