Symfony3.4控制器注入EntityMerger遇空值及路由调试报错问题
解决Symfony 3.4中EntityMerger注入为null及
debug:router报错的问题 一、EntityMerger注入后为null的排查与解决
这大概率是依赖注入配置或控制器服务注册的问题,咱们一步步来排查:
确认EntityMerger已注册为Symfony服务
先通过命令检查服务是否存在:php bin/console debug:container EntityMerger如果找不到服务,分两种情况处理:
- 若
EntityMerger是你自定义的工具类:在app/config/services.yml中添加服务定义,开启自动装配:services: App\Service\EntityMerger: autowire: true autoconfigure: true - 若它是第三方Bundle提供的服务:先确认对应的Bundle已经在
app/AppKernel.php中启用,并且Bundle的服务配置已正确加载。
- 若
确保控制器被正确注册为服务
Symfony 3.4中,要让控制器能自动注入依赖,得把它标记为服务并开启自动装配。在app/config/services.yml中补充:services: App\Controller\MovieController: autowire: true tags: ['controller.service_arguments']这样控制器的构造函数才能自动拿到依赖实例。
检查控制器构造函数的写法
确保构造函数有正确的类型提示,别覆盖父类构造却忽略了依赖注入逻辑:use App\Service\EntityMerger; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class MovieController extends Controller { private $entityMerger; public function __construct(EntityMerger $entityMerger) { $this->entityMerger = $entityMerger; } // 你的patchMovieAction方法 public function patchMovieAction(Request $request, Movie $movie) { // 这里$this->entityMerger就不会是null了 $this->entityMerger->merge($movie, $request->request->all()); // ...后续业务逻辑 } }
二、php bin/console debug:router报错的排查与解决
这个报错通常和路由配置或缓存有关,按下面的步骤处理:
检查PATCH路由的配置
确保路由正确指定了PATCH方法,且控制器方法参数和路由参数匹配:- 若用注解路由:
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Request; /** * @Route("/movies/{id}", name="patch_movie", methods={"PATCH"}) */ public function patchMovieAction(Request $request, Movie $movie) { // ...你的业务逻辑 } - 若用YAML路由(
app/config/routing.yml):patch_movie: path: /movies/{id} methods: [PATCH] controller: App\Controller\MovieController::patchMovieAction
注意:
{id}参数要和方法中的Movie $movie对应(依赖Symfony的参数转换器自动加载实体,确保Doctrine配置正常)。- 若用注解路由:
清除缓存
Symfony 3.4的缓存偶尔会导致路由解析异常,执行命令清除缓存:php bin/console cache:clear --env=dev之后再运行
php bin/console debug:router看看是否恢复正常。针对性处理报错信息
如果以上步骤没解决,仔细看报错内容:- 若提示“Cannot resolve controller for route ...”:检查控制器类名、方法名拼写是否正确,且控制器已被注册为服务。
- 若提示参数相关错误:核对路由参数和控制器方法参数的名称、类型是否匹配。
内容的提问来源于stack exchange,提问作者Naruto Uzumaki
相关产品推荐
相关产品推荐

