Symfony 5.4注解路由部署到Linux服务器后失效求助
问题梳理
本地Windows开发的Symfony应用部署到Linux服务器后,控制器中通过@Route注解定义的路由无法加载,执行symfony console debug:router仅显示admin和profiler路由;手动在routes.yaml中配置路由时,出现"App\Controller\IndexController" has no container set错误。
排查与解决步骤
1. 清除并预热生产环境缓存
Linux环境下Symfony的生产环境会启用路由缓存,部署后未清除缓存会导致新路由无法加载:
# 清除生产环境缓存 php bin/console cache:clear --env=prod # 预热生产环境缓存 php bin/console cache:warmup --env=prod
同时检查var/cache目录的权限,确保服务器运行用户(如www-data)拥有读写权限:
chown -R www-data:www-data var/
2. 确认路由配置文件的导入关系
检查config/routes.yaml是否导入了注解路由配置。默认情况下,Symfony需要显式导入annotations.yaml才能加载注解路由,可在空的routes.yaml中添加:
imports: - { resource: routes/annotations.yaml }
另外,确认config/routes_prod.yaml(如果存在)中没有禁用注解路由的配置。
3. 检查Linux文件大小写一致性
Windows系统不区分文件名大小写,但Linux严格区分:
- 确认控制器文件名(如
IndexController.php)首字母大写,与命名空间App\Controller\IndexController完全匹配 - 检查
src/Controller目录名称是否正确(首字母大写,无拼写错误)
4. 验证控制器服务的自动注册
检查config/services.yaml中的自动配置是否正确覆盖了控制器:
services: _defaults: autowire: true autoconfigure: true App\: resource: '../src/' exclude: - '../src/DependencyInjection/' - '../src/Entity/' - '../src/Kernel.php'
上述配置已包含src/Controller目录(未被排除),但仍可执行以下命令验证控制器是否已注册为服务:
php bin/console debug:container App\Controller\IndexController
若显示"Service not found",执行composer dump-autoload更新自动加载规则,或手动注册控制器服务:
App\Controller\IndexController: tags: [controller.service_arguments]
controller.service_arguments标签确保控制器能正确获取Symfony容器实例,解决手动路由时的容器错误。
5. 检查注解路由的配置细节
确认config/routes/annotations.yaml中的配置正确:
controllers: resource: ../../src/Controller/ type: annotation prefix: ru: '' en: '/en'
确保resource路径正确(相对于配置文件的路径,../../src/Controller/对应项目根目录下的src/Controller/),且type: annotation未被注释。
内容的提问来源于stack exchange,提问作者Nik Demchenkov

