在Symfony 5捆绑包结构中,bundle class和routing.yaml应该放在哪里?

wwtsj6pe  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(80)

使用Symfony 4.4捆绑包文件结构

foo-bundle
├─ Resources
│  └─ config
│     └─ routing.yaml
└─ FooBundle.php

在应用程序的routes.yml中,您将像这样加载bundle的路由:

foo_bundle:
  resource: '@FooBundle/Resources/config/routing.yaml'

使用Symfony 5捆绑包结构,您可以:

foo-bundle
├─ config
│  └─ routing.yaml
└─ src
   └─ FooBundle.php

但似乎路径是相对于FooBundle.php的,在应用程序的routes.yml中,您不能使用..,即这是无效的:

resource: '@FooBundle/../config/routing.yaml'

那么我如何加载bundle的路由呢?
唯一的方法似乎是将`` FooBundle.php `提升一个级别,但是这样它就需要在自动加载器中进行特殊处理,而文档(绿色框)中的自动加载示例不包含这种特殊处理。

vxqlmq5t

vxqlmq5t1#

这个文档实际上有点混乱。对于5.4,您需要调整Bundle::getPath以使用新的目录结构。对于6.x,新的AbstractBundle类为您完成了这一任务。

class MyBundle extends Bundle
{
    public function getPath(): string
    {
        if (null === $this->path) {
            $reflected = new \ReflectionObject($this);
            // assume the modern directory structure by default
            $this->path = \dirname($reflected->getFileName(), 2); // The 2 is key
        }

        return $this->path;

也许值得指出的是,5.4文档仍然显示了旧的bundle结构。阅读文档时设置正确的文档版本通常是值得的,只是为了避免这类问题。但最新的文档再次表明,这一变化发生在Symfony 5中。

相关问题