внедрить событие в сервис

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

Я предполагаю, что это сложно, потому что события могут быть структурированы очень по-разному:
Event1 ожидает три параметра в конструкторе, а Event2 - только один.

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

Как я могу добиться чего-то подобного?

Может быть, наоборот: запустить событие службы и сделать событие слушателя независимым?


person ivoba    schedule 14.09.2012    source источник
comment
Вы хотите запускать только пользовательские события или также события, предоставляемые Symfony2 или другим пакетом?   -  person Florian Eckerstorfer    schedule 14.09.2012
comment
я хотел бы, чтобы это было как можно более гибким, поэтому я думаю, что любое событие   -  person ivoba    schedule 14.09.2012
comment
Как вы хотите получить событие? Получает ли служба только название события? Вы уже имеете представление о том, как (возможные) аргументы события передаются вашему сервису?   -  person Florian Eckerstorfer    schedule 14.09.2012
comment
прямо сейчас я бы сказал, что это как-то не работает, может быть, это даже не имеет смысла, потому что на самом деле только сам бандл может знать, что было бы подходящим для включения в событие   -  person ivoba    schedule 14.09.2012


Ответы (1)


Если вызывающая сторона службы знает об аргументах события, а слушатель события знает о событии, можно было бы создать событие.

Я основываю свой пример на примере из поваренной книги Symfony2: Как расширить класс без с использованием наследования.

Обычно вы бы отправили такое событие:

$event = new HandleUndefinedMethodEvent($this, $method, $arguments);
$this->dispatcher->dispatch('foo.method_is_not_found', $event);

В вашем сервисе вы можете добавить метод для создания новых событий:

public function createEvent($name, $class, $arguments)
{
    ...
    $eventClass = new \ReflectionClass($class);
    $event = $eventClass->newInstanceArgs($arguments);
    $this->dispatcher->dispatch($name, $event);
}

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

person Florian Eckerstorfer    schedule 14.09.2012
comment
да, это хорошая идея, но здесь аргументы исходят извне службы, что не очень полезно. Между тем я действительно сомневаюсь в своем подходе. - person ivoba; 14.09.2012
comment
Если вы хотите, чтобы в вашем контроллере была какая-то логика для управления аргументами, передаваемыми событию, я бы реализовал несколько вспомогательных служб. В зависимости от типа события я бы вызвал эту вспомогательную службу, которая вычисляет параметры для события, а затем возвращается к вашей основной службе для отправки события. - person Florian Eckerstorfer; 14.09.2012