Есть ли способ отправить параметры наблюдателю? - PullRequest
1 голос
/ 07 июня 2019

Есть ли способ отправить параметры Наблюдателю в Eloquent 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 напрямую, но я использую eloquent (illuminate/database и illuminate/events)

Я не пытаюсь отправить дополнительные параметры явному событию, напримерв: Наблюдатели Laravel - Любой способ передать дополнительные аргументы? , я пытаюсь создать наблюдателя с дополнительными параметрами.


ПОЛНОЕ РЕШЕНИЕ:

Спасибо @ 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 Ответ

2 голосов
/ 08 июня 2019

В событиях Illuminate есть строка , это означает, что при подписке на событие он использует контейнер.Это означает, что мы можем использовать это в наших интересах, я не очень хорошо знаком с не Laravel загруженными приложениями.Но где бы ни определялось ваше приложение, вы будете привязывать свой класс к своему собственному классу.

$container = new Container();

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

$dispatcher = new Dispatcher($container);

Это приведет к тому, что в следующий раз, когда ваше приложение разрешит ваш класс, оно будет использовать эту версию и для васможете настроить свой класс так, как вы хотите.

Редактировать: пример того, как вы можете использовать контейнер Laravel для использования функции связывания.

...