有没有一种方法可以将参数发送给观察者?

时间:2019-06-07 20:37:11

标签: laravel eloquent illuminate-container

是否有一种方法可以向雄辩的ORM中的观察者发送参数?

基于laravel的文档:

User::observe(UserObserver::class);

observe方法接收一个类,而不是对象的实例。所以我不能做类似的事情:

$observer = new MyComplexUserObserver($serviceA, $serviceB)
User::observe($observer);

因此,在我的代码中,我可以执行以下操作:

class MyComplexUserObserver
{
    private $serviceA;
    private $serviceB;

    public function __constructor($serviceA, $serviceB){
        $this->serviceA = $serviceA;
        $this->serviceB = $serviceB;
    }

    public function created(User $user)
    {
        //Use parameters and services here, for example:
        $this->serviceA->sendEmail($user);
    }
}

是否可以将参数或服务传递给模型观察者?

  

我没有直接使用laravel,而是雄辩的(illuminate/databaseilluminate/events

     

我没有尝试向显式事件发送附加参数,例如:Laravel Observers - Any way to pass additional arguments?,而是在尝试构造具有附加参数的观察器。


完整解决方案:

谢谢@ martin-henriksen。

use Illuminate\Container\Container as IlluminateContainer;

$illuminateContainer = new IlluminateContainer();
$illuminateContainer->bind(UserObserver::class, function () use ($container) {
    //$container is my project container
    return new UserObserver($container->serviceA, $container->serviceB);
});
$dispatcher = new Dispatcher($illuminateContainer);

Model::setEventDispatcher($dispatcher); //Set eventDispatcher for all models (All models extends this base model)
User::observe(UserObserver::class); 

1 个答案:

答案 0 :(得分:2)

在Illuminate事件中有line,这表示在事件订阅时它会使用容器。这意味着我们可以利用它来发挥我们的优势,我对非Laravel自举应用程序不是很熟悉。但是无论您定义了什么应用,都将您的类绑定到自己的类。

$container = new Container();

$container->bind(MyComplexUserObserver::class, function ($app) {
    return new MyComplexUserObserver($serviceA, $serviceB, $theAnswerToLife);
});

$dispatcher = new Dispatcher($container);

这将导致下次您的应用程序解析您的课程时,它将使用该版本的课程,因此您可以根据需要设置课程。

编辑:一个示例,说明如何利用Laravel容器来利用绑定功能。