Symfony5出现Call to a member function getId() on null错误但Repository其余方法正常
问题根因
该报错的核心原因是Symfony路由匹配优先级逻辑冲突:
你定义的vehicle/{id}动态路由没有对id参数做格式限制,且该路由的定义顺序排在vehicle/list静态路由之前。当你请求/vehicle/list接口时,Symfony会优先匹配位置更靠前的动态路由,将路径段list当做id参数传入findById方法。findOneBy(['id' => 'list'])无法查询到对应记录,返回null,你未做判空直接调用null->getId()触发报错,因此异常堆栈会指向findById方法,此时请求根本没有进入你编写的findAll接口。
解决方案
1. 给动态路由添加参数格式限制
给findById路由增加requirements规则,限制id必须为数字,避免字符串类型的路径段匹配到该路由:
/** * @Route("vehicle/{id}", name="findById", methods={"GET"}, requirements={"id"="\d+"}) */ public function findById($id): JsonResponse { // 方法逻辑不变 }
2. 调整路由定义顺序
将vehicle/list静态路由的定义放到vehicle/{id}动态路由之前,Symfony会优先匹配位置更靠前的静态路由,不会出现路由错配问题。
3. 增加空值判断兜底
无论单条查询还是列表查询,都要对返回的实体做判空处理,避免查询无结果时触发成员方法调用错误:
// 单条查询判空示例 public function findById($id): JsonResponse { $vehicle = $this->vehicleRepository->findOneBy(['id' => $id]); if (null === $vehicle) { return new JsonResponse(['msg' => '对应车辆不存在'], Response::HTTP_NOT_FOUND); } $data = [ 'id' => $vehicle->getId(), 'VIN' => $vehicle->getVIN() ]; return new JsonResponse($data, Response::HTTP_OK); } // 列表查询判空示例 public function findAll(): JsonResponse { $vehicles = $this->vehicleRepository->findAll(); $data = []; foreach ($vehicles as $vehicle) { if ($vehicle) { $data[] = [ 'id' => $vehicle->getId(), 'VIN' => $vehicle->getVIN() ]; } } return new JsonResponse($data, Response::HTTP_OK); }
内容的提问来源于stack exchange,提问作者Irvin Eduardo Medina Vazquez
相关产品推荐
相关产品推荐

