Symfony 3.4升级至4.4:自定义路由加载器调用类报错
Symfony 3.4升级到4.4后自定义路由加载器报错解决
问题详情
我通过自定义服务加载路由,配置如下:
additional_routes: resource: 'routeLoader:load' type: service
路由加载器代码:
// 省略部分代码 use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use tt\myBundle\Entity\ContentPage; class routeLoader{ private $doctrine; private $router; public function __construct($doctrine, UrlGeneratorInterface $router){ $this->doctrine = $doctrine; $this->router = $router; } public function load($resource, $type=NULL){ // 省略部分代码 $contentPageCollection = $this->doctrine->getRepository('ttmyBundle:ContentPage')->findAll(); // 省略部分代码 } }
从Symfony 3.4升级到4.4后,出现错误:
Class ContentPage::class does not exist in routeLoader:load (which is being imported from "../EDITED/config/routes.yaml"). Make sure there is a loader supporting the "service" type.
尝试修改为以下代码后问题仍未解决:
$contentPageCollection = $this->doctrine->getRepository('ContentPage::class')->findAll();
解决方法
1. 修正Doctrine仓库引用
Symfony 4+ 不再推荐使用Bundle:Entity的旧格式获取仓库,且你之前的错误写法把ContentPage::class用引号包裹,导致被当成字符串解析。正确写法直接使用类常量:
$contentPageCollection = $this->doctrine->getRepository(ContentPage::class)->findAll();
确保已经通过use tt\myBundle\Entity\ContentPage;引入实体类,这样类常量会自动解析为完整类名。
2. 确保路由加载器服务配置正确
Symfony 4+ 对服务注册要求更严格,需确保routeLoader实现Symfony\Component\Config\Loader\LoaderInterface接口,并在config/services.yaml中正确配置服务标签:
# 替换为你的类实际命名空间 App\Routing\routeLoader: arguments: $doctrine: '@doctrine' $router: '@router' tags: - { name: routing.loader }
routing.loader标签是让Symfony识别该服务为路由加载器的关键。
3. 更新路由配置的服务引用
Symfony 4+ 中服务类型的路由资源需要使用完整服务ID,而非短名称。修改routes.yaml:
additional_routes: resource: 'App\Routing\routeLoader' # 替换为你的服务完整ID type: service
内容的提问来源于stack exchange,提问作者Christian Stegemann
相关产品推荐
相关产品推荐

