Symfony 将其他参数添加到事件订阅服务器中
我用的是symfony3。我已经创建了一些活动,它们运行良好。但这一新事件是不同的。我必须以某种方式向订户发送一些附加参数。最好的方法是什么?我创建了一个服务来执行这个任务。控制器将调度一个事件,如:Symfony 将其他参数添加到事件订阅服务器中,symfony,events,listener,Symfony,Events,Listener,我用的是symfony3。我已经创建了一些活动,它们运行良好。但这一新事件是不同的。我必须以某种方式向订户发送一些附加参数。最好的方法是什么?我创建了一个服务来执行这个任务。控制器将调度一个事件,如: $dispatcher = $this->container->get('event_dispatcher'); $dispatcher->dispatch(Events::POWERPLANT_GET_DATA, new PowerPlantEvent($thi
$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)
如何做到这一点?您应该将所有必要的数据放入事件本身,然后可以在订阅服务器中访问它们 为了简单起见,我公开了属性,并将所有属性添加到
\uu构造中
,但如何实现它取决于您。您可能需要为此创建新的事件类
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)
);
订阅服务器(或事件侦听器)中的访问权限
您应该将所有必要的数据放入事件本身,然后可以在订阅服务器中访问它们 为了简单起见,我公开了属性,并将所有属性添加到
\uu构造中
,但如何实现它取决于您。您可能需要为此创建新的事件类
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)
);
订阅服务器(或事件侦听器)中的访问权限
如果事件使用可选参数,则可以在构造函数中将其设置为可选
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))
);
或:
在订阅服务器中,只需使用这些getter:
public function onPowerPlantGetData(PowerPlantEvent $powerPlantEvent)
{
$powerPlantEvent->getStartDate();
// ...
}
如果事件使用可选参数,则可以在构造函数中将其设置为可选
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))
);
或:
在订阅服务器中,只需使用这些getter:
public function onPowerPlantGetData(PowerPlantEvent $powerPlantEvent)
{
$powerPlantEvent->getStartDate();
// ...
}
我是否可以分发事件,如:$dispatcher->dispatch(事件::POWERPLANT\u GET\u DATA,new PowerPlantEvent($this->getPowerPlantAction($id)),$startDate,$endDate,$measurement,$field);或者有其他方法吗?我可以像:$dispatcher->dispatch(Events::POWERPLANT\u GET\u DATA,new PowerPlantEvent($this->getPowerPlantAction($id)),$startDate,$endDate,$measurement,$field)这样分发事件吗;或者有其他方法吗?Tnx,我试过了,效果很好。关于这部分事件的文档很差。我还考虑创建一个新类,或者为此创建一个命令。因为有了这个,我开始了使用influx数据库从另一个symfony应用程序通过phenastalk作业获取数据的过程。事件是实现此功能的最佳方式,还是使用自定义类或symfony命令更好?很好。我没有多少信息可以给你提供有用的建议。我会尝试两种方法,并保留一种更适合你的方法。我个人更喜欢活动。命令(用命令总线的术语)将是更大的架构更改,在这里没有附加值。关于这部分事件的文档很差。我还考虑创建一个新类,或者为此创建一个命令。因为有了这个,我开始了使用influx数据库从另一个symfony应用程序通过phenastalk作业获取数据的过程。事件是实现此功能的最佳方式,还是使用自定义类或symfony命令更好?很好。我没有多少信息可以给你提供有用的建议。我会尝试两种方法,并保留一种更适合你的方法。我个人更喜欢活动。命令(用命令总线的术语)将是更大的架构更改,在这里没有附加值。