Mezzio中委托工厂的回调执行返回null而非服务实例?
问题排查与解决步骤
修正类的构造方法拼写错误
你当前编写的MoneyService类存在PHP语法层面的低级拼写问题:
// 错误写法:类构造魔术方法命名错误 public function __constructor(LoggerService $logger) { $this->logger = $logger; }
PHP 中类的构造方法固定命名为__construct,错误的命名会让这个方法退化为普通实例方法,容器的自动反射解析逻辑无法识别需要注入LoggerService依赖,哪怕后续补全配置也无法正确生成符合预期的服务实例。需要修正为:
class MoneyService { public function __construct(LoggerService $logger) { $this->logger = $logger; } }
为目标服务补充基础原始构建定义
委托工厂本身不承担生成原始服务实例的职责,只是服务构建流程的中间包装层。你当前的配置只定义了MoneyService的委托规则,但没有给容器提供生成原始MoneyService实例的基础构建逻辑,这就是$callback()返回null的核心原因。
这里解释下你观察到的
$container->has(MoneyService::class) === true的现象:容器检测服务存在性时,只要服务名被纳入了委托规则的配置映射,就会判定该服务可解析;但如果没有配套的原始构建定义,委托工厂拿到的$callback是一个没有绑定实际生成逻辑的空闭包,执行后就会返回null。
你需要在dependencies配置块中,为MoneyService补充基础的服务定义,两种常用写法二选一:
- 如果服务可以被容器自动反射解析(即所有依赖都能被容器自动识别匹配),直接声明为可调用实例:
'dependencies' => [ 'invokables' => [ MoneyService::class, ], 'delegators' => [ MoneyService::class => [ MoneyServiceDelegatorFactory::class, ], ], ], - 如果需要显式控制实例生成逻辑,单独配置匹配的工厂:
'dependencies' => [ 'factories' => [ MoneyService::class => YourCustomMoneyServiceFactory::class, ], 'delegators' => [ MoneyService::class => [ MoneyServiceDelegatorFactory::class, ], ], ],
验证委托工厂执行逻辑
完成上述配置后,调整委托工厂的测试逻辑,确认实例能被正常生成:
class MoneyServiceDelegatorFactory { public function __invoke(ContainerInterface $container, string $name, callable $callback) { // 获取原始服务实例 $originalService = $callback(); // 验证实例类型 var_dump($originalService instanceof MoneyService); // 修正后会输出bool(true) // 在此处实现包装逻辑(比如加日志切面、扩展功能) return $originalService; } }
注意:测试阶段写的
die强制中断逻辑会打乱容器的依赖收集流程,验证通过后需要及时移除。
额外排查点
如果修正上述问题后还是返回null,需要检查两项配置:
- 确认
dependencies配置块处于容器可识别的正确作用域下,没有被嵌套到其他无效的配置层级中 - 排查是否存在其他同名的配置块,覆盖了你编写的
delegators规则
内容的提问来源于stack exchange,提问作者pepper
相关产品推荐
相关产品推荐

