【发布时间】:2023-03-17 04:36:01
【问题描述】:
请注意,在提出这些问题之前,我已经调查过:
laravel-4 way to inject an object that requires configuration into a controller
Laravel 4: Passing data from make to the service provider
和
Laravel 4: Confused about how to use App::make()
但我看不到他们回答了我的问题!
领域模型: 一个站点必须有一个所有者,目前这个所有者是客户类型,但将来可以更改为经销商或员工等。所以我使用多态性如下:
类站点有一个所有者属性。 所有者是一个接口, Customer 是一个实现 Owner 的类, Customer 有一个 Name 和一个 Uid,因此它们在 Customer 的构造函数中是必需的。
现在我想将 Customer 实现绑定到 Owner 接口,这样每当我调用 Owner 时,我都会得到一个 Customer。
我们通常会这样做:
class UseCustomerAsSiteOwnerServiceProvider extends ServiceProvider{
public function register()
{
$this->app->bind('hidden\Domain\Model\Site\Owner', function ($app)
{
return $this->app->make(new Customer());
});
}
}
但是 Customer() 需要初始化 $id 和 $name 并且这些是变量对象 - 不是静态的所以我不知道如何传递它们?
我试过了:
public function register()
{
$this->app->bind('hidden\Domain\Model\Site\Owner', function ($app) use ($id, $name)
{
return $this->app->make(new Customer($id, $name));
});
}
但在这种情况下,USE 语句中的 $name 和 $id 没有定义。有人有想法吗?
更新: 客户构造函数如下:
/**
* Initialise a new Customer
*
* @param Identifier $id
* @param CustomerName $name
*/
public function __construct(Identifier $id, $name)
{
$this->id = $this->setId($id);
$this->name = $this->setName($name);
}
这将从聚合根(站点)初始化。正确的类型将被传递给它。
【问题讨论】:
-
您正确地将它们传递到闭包中,它们没有被定义,因为您从未在闭包之前定义它们。
$id和$name究竟来自哪里,variable objects是什么意思? -
@user3158900 我用更多信息更新了这个问题。我的意思是,Id 和 Name 的值都会根据我们要初始化的客户而有所不同。我发现的示例问题都使用静态值作为参数,因此很容易在 Service Provider 中使用它们。
标签: php laravel domain-driven-design laravel-5 service-provider