Laravel中如何在工厂方法中注入服务依赖并传递自定义参数?
解决方案
1. 重构产品类 ActivityReport
把动态业务参数Customer从构造函数移到业务方法中,仅保留框架可自动注入的服务类作为构造参数:
class ActivityReport { private $activityService; // 仅注入Laravel容器可自动解析的服务类 public function __construct(ActivityService $activityService) { $this->activityService = $activityService; } // 将Customer通过业务方法传入 public function getData(Customer $customer) { // 后续业务逻辑可在此扩展 return $this->activityService->getAll($customer->id); } }
2. 调整工厂类 ActivityReportCreator
利用Laravel容器自动解析ActivityReport的依赖,无需手动实例化时传入ActivityService:
方式一:直接通过容器获取实例
class ActivityReportCreator extends ReportCreator { private $customer; public function __construct(Customer $customer) { $this->customer = $customer; } public function generate() { // 容器自动注入ActivityService到ActivityReport $activityReport = app(ActivityReport::class); return $activityReport->getData($this->customer); } }
方式二:通过构造注入ActivityReport(更符合依赖注入原则)
class ActivityReportCreator extends ReportCreator { private $customer; private $activityReport; // Laravel自动解析ActivityReport及其依赖的ActivityService public function __construct(Customer $customer, ActivityReport $activityReport) { $this->customer = $customer; $this->activityReport = $activityReport; } public function generate() { return $this->activityReport->getData($this->customer); } }
核心逻辑说明
Laravel的依赖注入容器只能自动解析无动态业务参数的类构造函数,将Customer这类需要动态传入的业务参数移到方法中,就能让框架自动处理ActivityService这类已注册服务的注入,同时完美适配工厂方法模式的结构。
内容的提问来源于stack exchange,提问作者KaneOgg88
相关产品推荐
相关产品推荐

