2016-08-02 2 views
1

Я использую symfony 3. Я уже создал несколько событий, и они отлично работают. Но это новое событие отличается. Я должен как-то отправить некоторые дополнительные параметры подписчику. Каков наилучший способ сделать это? Я создал службу phenstalk для выполнения работы. Контроллер отправляет событие, подобное:Добавить дополнительные параметры в подписчик событий

$dispatcher = $this->container->get('event_dispatcher'); 
    $dispatcher->dispatch(Events::POWERPLANT_GET_DATA, new  PowerPlantEvent($this->getPowerPlantAction($id))); 

Звонок, как это не будет работать, потому что у меня отсутствуют некоторые параметры.

и у меня есть действие в подписчика:

public function onPowerPlantGetData(PowerPlantEvent $event, $startDate, $endDate, $measurement, $field) 

Как сделать это?

+0

Могу ли я Dispach событие, как: $ диспетчеру -> отправка (События :: POWERPLANT_GET_DATA, новый Powe rPlantEvent ($ this-> getPowerPlantAction ($ id)), $ startDate, $ endDate, $ measurement, $ field); Или есть другой способ? – sanof

ответ

0

Если событие использует дополнительные параметры , вы можете сделать их необязательными в конструкторе.

use Symfony\Component\EventDispatcher\Event; 

final class PowerPlantEvent extends Event 
{ 
    /** 
    * @var PowerPlantAction 
    */ 
    private $powerPlantAction; 

    /** 
    * @var \DateTime 
    */ 
    private $startDate; 

    /** 
    * @var \DateTime 
    */ 
    private $endDate; 

    /** 
    * @var int 
    */ 
    private $measurement; 

    /** 
    * @var string 
    */ 
    private $field; 

    public function __construct(
     $powerPlantAction, 
     $startDate = null, 
     $endDate = null, 
     $measurement = null, 
     $field = null 
    ) { 
     $this->powerPlantAction = $powerPlantAction; 
     $this->startDate = $startDate; 
     $this->endDate = $endDate; 
     $this->measurement = $measurement; 
     $this->field = $field; 
    } 

    public function getPowerPlantAction() 
    { 
     return $this->powerPlantAction; 
    } 

    public function getStartDate() 
    { 
     return $this->startDate; 
    } 

    public function getEndDate() 
    { 
     return $this->endDate; 
    } 

    public function getMeasurement() 
    { 
     return $this->measurement; 
    } 

    public function getField() 
    { 
     return $this->field; 
    } 
} 

Тогда диспетчерская так:

$this->eventDispatcher->dispatch(
    Events::POWERPLANT_GET_DATA, 
    new PowerPlantEvent($this->getPowerPlantAction($id)) 
); 

Или:

$this->eventDispatcher->dispatch(
    Events::POWERPLANT_GET_DATA, 
    new PowerPlantEvent(
     $this->getPowerPlantAction($id), 
     $startDate, 
     $endDate, 
     $measurement, 
     $field 
    ) 
); 

В вашем подписчику просто использовать эти методы получения:

public function onPowerPlantGetData(PowerPlantEvent $powerPlantEvent) 
{ 
    $powerPlantEvent->getStartDate(); 
    // ... 
} 
+0

Tnx, я пробовал, и все работает отлично. В этой части событий документация оставляет желать лучшего. Я также думаю о создании нового класса или, возможно, команды для этого. Потому что с этим я начал процесс получения данных отменил работу phenastalk из другого приложения symfony, используя базу данных притока. Является ли событие лучшим способом реализации этой функции, или будет лучше использовать команду custom или symfony? – sanof

+0

Хорошо. У меня мало информации, чтобы дать вам полезные советы. Я бы попробовал оба подхода и сохранил тот, который вам подходит. Я лично предпочитаю события. Команда (в терминологии Command Bus) будет больше архитектурных изменений без добавленной стоимости здесь. –

0

Вы должны поместить все необходимые данные в самом событие, а затем вы можете получить доступ к ним в подписчике

Для простоты я сделал свойство общественным и добавил все __construct, но это до вас, как вы его реализовать. Вы можете создать новый класс событий для этого

class PowerPlantEvent extends Event 
{ 
    /** 
    * @var \DateTime 
    */ 
    public $startDate; 

    /** 
    * @var \DateTime 
    */ 
    public $endDate; 

    /** 
    * @var Something 
    */ 
    public $measurement; 

    public $field; 

    /** 
    * PowerPlantEvent constructor. 
    * 
    * @param \DateTime $startDate 
    * @param \DateTime $endDate 
    * @param Something $measurement 
    * @param   $field 
    */ 
    public function __construct(\DateTime $startDate, \DateTime $endDate, Something $measurement, $field) 
    { 
     $this->startDate = $startDate; 
     $this->endDate = $endDate; 
     $this->measurement = $measurement; 
     $this->field = $field; 
    } 
} 

и назвать его

$dispatcher = $this->container->get('event_dispatcher'); 
$dispatcher->dispatch(
    Events::POWERPLANT_GET_DATA, 
    new PowerPlantEvent($startDate, $endDate, $measurement, $field) 
); 

и доступом в абоненте (или слушатель событий)

public function onPowerPlantGetData(PowerPlantEvent $event) 
{ 
    $startDate = $event->startDate; // you might want to implement getters for those 
} 
Смежные вопросы