Symfony2 bundle继承丢失父包路由

tee*_*mup 26 php routing annotations symfony

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

根据我从文档中理解的内容,Symfony2应首先从子包中查找所有文件,包括路由,然后从父包中查找.现在没有发生,只有子捆绑控制器似乎被加载.

在我的子包Bundle文件中,我按照指示实现了getParent函数,在我的routing.yml中,我有:

ParentBundle:
resource: "@Parent/Controller/"
type:     annotation
prefix:   /admin/
Run Code Online (Sandbox Code Playgroud)

在继承之前工作得很好.

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

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

小智 18

我找到了解决这个问题的正确方法.今天我还试图覆盖配置了注释路由的父包,并且如果anotation routing导入整个包("@ SomeBundle/Controller"),也发现父路由被忽略.

经过一些调试后,我发现对此的解释是,如果你使用"@"作为控制器的前缀,这将传递给内核解析器,如果父资源被覆盖,它将仅返回子资源.因此,解决方案是提供bundle的完整路径,考虑到内核将尝试匹配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
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*miS 10

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

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

# routing_child.yml     
_parent:
    resource: "@MyParentBundle/Resources/config/routing.yml"
Run Code Online (Sandbox Code Playgroud)

  • 使用bundle继承时,Symfony会覆盖任何相同名称的文件(无论是模板还是配置文件). (2认同)