2016-08-02 62 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事件,如:$调度 - > dispatch(Events :: POWERPLANT_GET_DATA,new 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,我试过了,它工作正常。这部分事件的文档很差。我也考虑创建新课程或为此命令。因为有了这个,我开始使用influx数据库从另一个symfony应用程序获取数据thrue phenastalk作业。事件是实现这个功能的最好方式,还是使用自定义类或symfony命令会更好? – sanof

+0

好。我没有什么信息可以给你提供有用的建议。我会尝试两种方法,并保持一个更适合你的方法。我个人更喜欢事件。命令(在命令总线的术语中)将是更大的体系结构更改,这里没有附加值。 –

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 
}