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)