【问题标题】:Laravel Bind Object Interface with an implementation that has variables parameters in it's constructorLaravel 绑定对象接口与在其构造函数中具有变量参数的实现
【发布时间】: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


【解决方案1】:

因为我认为不可能传递变量,所以我决定从 Customer 中删除构造函数并使用自定义方法设置它的属性,这样现在我可以说:

$this->owner->setId(Identifier Id)。服务提供商会将 Owner 解析为其 Customer 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多