我想使用工厂方法设计模式创建一个服务。所以我创建了以下产品:
class ActivityReport
{
private $activityService;
public function __construct(Customer $customer, ActivityService $activityService)
{
$this->activityService = $activityService;
}
public function getData()
{
// It will be more code
return $this->activityService->getAll($this->customer->id);
}
}
我这样称呼它:
class ActivityReportCreator extends ReportCreator
{
private $customer;
function __construct(Customer $customer)
{
$this->customer = $customer;
}
public function generate() {
$activity = new ActivityReport($customer->id);
return $activity->getData();
}
}
这里的问题在于产品中的构造函数,它通过 DI(依赖注入)接受应该自动加载的服务,就像服务或控制器通常发生的情况一样。
activityService
已注册并可在例如控制器中运行。我可以使用 app(ActivityReport::class)
运行它,但首先,我仍然需要将 $customer
对象传递给方法,而不是传递给构造函数。其次,我想在任何地方一致地引用该服务,就像在控制器中所做的那样。
我怎样才能实现这个目标?
如果你想持久化服务,我认为你的函数不应该绑定到特定的服务实例。由于函数
getData()
需要根据$customer->id
确定其行为,因此您需要传递特定的服务实例而不是抽象对象。综上所述,如果你想持久地引用服务,你的服务应该是一个抽象对象,而不是一个实例。
也许你可以尝试
getData($customerId)
。