Symfony 4.4中无法在父抽象类注入Serializer服务
Symfony 4.4 抽象类构造函数注入Serializer服务失败的解决办法
问题现象
你为抽象类AbstractDTOMapper配置了Serializer服务注入,但运行时仍报错:
Too few arguments to function App\DTO\AbstractDTOMapper::__construct(), 0 passed in C:\Users\me\Documents\project\src\Entity\Common\User.php on line 296 and exactly 1 expected
核心原因
错误根源是你在User.php第296行手动使用new关键字实例化了AbstractDTOMapper(或它的子类),没有传入Serializer参数。Symfony的依赖注入仅对通过服务容器获取的实例生效,手动new的类不会触发容器的自动注入逻辑。
解决方案
方案1:通过服务容器获取实例(推荐)
Symfony的依赖注入体系要求所有需要注入服务的类都通过容器获取,不要手动new:
- 假设你有继承
AbstractDTOMapper的子类(比如UserDTOMapper),无需重复配置参数,只需在services.yaml中指定继承抽象类的配置:App\DTO\UserDTOMapper: parent: App\DTO\AbstractDTOMapper - 在
User.php中通过依赖注入获取子类实例,而非手动new:
注:Symfony 4.4默认开启服务自动配置,若子类在namespace App\Entity\Common; use App\DTO\UserDTOMapper; class User { private $dtoMapper; // 通过构造函数注入子类实例 public function __construct(UserDTOMapper $dtoMapper) { $this->dtoMapper = $dtoMapper; } public function yourMethod() { // 直接使用$this->dtoMapper即可,Serializer已自动注入 } }src/目录下,甚至可以不用手动配置services.yaml,容器会自动识别并完成依赖注入。
方案2:手动传入Serializer(仅限特殊场景)
如果必须手动实例化类,需要先从容器中获取Serializer服务再传入:
namespace App\Entity\Common; use Symfony\Component\DependencyInjection\ContainerInterface; use App\DTO\UserDTOMapper; class User { private $container; public function __construct(ContainerInterface $container) { $this->container = $container; } public function yourMethod() { // 从容器获取Serializer实例 $serializer = $this->container->get('serializer'); // 手动传入参数实例化子类 $dtoMapper = new UserDTOMapper($serializer); } }
额外注意
抽象类本身无法被实例化,你实际操作的肯定是它的子类。确保子类要么继承父类构造函数(不重写),要么重写构造函数时必须接收SerializerInterface参数并传递给父类:
class UserDTOMapper extends AbstractDTOMapper { // 若需扩展构造函数,必须传递Serializer给父类 public function __construct(SerializerInterface $serializer, OtherService $other) { parent::__construct($serializer); $this->other = $other; } }
内容的提问来源于stack exchange,提问作者naspy971
相关产品推荐
相关产品推荐

