Symfony 5 Bundle结构下Bundle类与routing.yaml的位置及路由加载问题
解决Symfony 5+自定义Bundle路由加载问题
针对你遇到的Symfony 5 Bundle结构下无法加载根目录config/routing.yaml的问题,给你几个无需修改自动加载规则的实用方案:
方案1:调整Bundle内的config目录位置
最简单的方式是把Bundle根目录下的config文件夹移到src目录内,结构变成:
foo-bundle └─ src ├─ config │ └─ routing.yaml └─ FooBundle.php
之后就能在应用的routes.yml里用常规方式加载:
foo_bundle: resource: '@FooBundle/config/routing.yaml'
这种方式完全符合Symfony的资源定位规则,不需要额外配置。
方案2:用PHP路由文件动态加载
如果不想调整目录结构,可在应用的config/routes目录下创建一个foo_bundle_routes.php文件,内容如下:
<?php use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; use YourVendor\FooBundle\FooBundle; return function (RoutingConfigurator $routes) { // 通过Bundle类的getPath()方法获取Bundle根目录 $routes->import(FooBundle::getPath() . '/config/routing.yaml'); };
然后在应用的routes.yaml里引入这个PHP文件:
foo_bundle: resource: './routes/foo_bundle_routes.php'
这种方式利用Bundle类的内置方法获取根目录,绕过了@FooBundle路径的限制。
方案3:通过Bundle扩展类自动注册路由
如果希望启用Bundle后自动加载路由,无需在应用端手动配置,可以创建一个Bundle扩展类:
在foo-bundle/src/DependencyInjection/FooExtension.php中编写:
<?php namespace YourVendor\FooBundle\DependencyInjection; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\Routing\Loader\YamlFileLoader; class FooExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../config')); $loader->load('routing.yaml'); } }
只要你的Bundle类(FooBundle.php)继承自AbstractBundle或者正确关联了这个扩展类,Symfony会在Bundle启用时自动加载路由配置,不用再在应用的routes.yaml里添加任何配置。
内容的提问来源于stack exchange,提问作者AndreKR
相关产品推荐
相关产品推荐

