如何在注入\App\Services\PolymorphicService时自动执行resolveClass方法返回对应实例
实现注入时自动执行resolveClass并返回结果的方案
可以实现,核心是利用Laravel服务容器的自定义绑定逻辑,常见有两种可行方案:
方案1:绑定到接口(更规范,无循环依赖风险)
适合需要区分原服务和解析后实例的场景,不会影响原服务的其他调用逻辑
- 先定义统一接口,所有
resolveClass可能返回的类都实现该接口:
interface PolymorphicResolveInterface { // 定义所有返回实例需要实现的公共方法 }
- 在
app/Providers/AppServiceProvider.php的register方法中添加绑定逻辑:
public function register() { $this->app->bind(PolymorphicResolveInterface::class, function ($app) { // 实例化原服务类,若原服务有依赖会自动注入 $polyService = $app->make(\App\Services\PolymorphicService::class); // 执行方法后返回目标实例 return $polyService->resolveClass(); }); }
- 控制器中直接注入接口即可,无需手动调用方法:
public function store(PolymorphicResolveInterface $poly) { // $poly就是resolveClass返回的实例,可直接使用 }
方案2:直接重写原服务类的解析逻辑
适合所有注入原服务的场景都需要返回目标实例的场景,不需要额外定义接口
在AppServiceProvider的register方法中添加解析回调:
public function register() { $this->app->resolving(\App\Services\PolymorphicService::class, function ($service, $app) { return $service->resolveClass(); }); }
配置后直接在控制器注入原服务类即可,拿到的就是resolveClass的返回结果:
public function store(\App\Services\PolymorphicService $poly) { // $poly已为目标实例,无需调用resolveClass }
注意事项
- 若希望单次请求内多次注入拿到的是同一个实例,把
bind换成singleton即可 - 因为
resolveClass依赖POST数据,建议添加非POST请求的异常处理或者默认值,避免控制台执行、GET请求等场景报错 - 方案2会全局覆盖原服务类的解析结果,如果有其他业务需要用到原
PolymorphicService的实例,不要使用该方案
内容的提问来源于stack exchange,提问作者panthro
相关产品推荐
相关产品推荐

