You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:43:09