Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 将其他参数添加到事件订阅服务器中_Symfony_Events_Listener - Fatal编程技术网

Symfony 将其他参数添加到事件订阅服务器中

Symfony 将其他参数添加到事件订阅服务器中,symfony,events,listener,Symfony,Events,Listener,我用的是symfony3。我已经创建了一些活动,它们运行良好。但这一新事件是不同的。我必须以某种方式向订户发送一些附加参数。最好的方法是什么?我创建了一个服务来执行这个任务。控制器将调度一个事件,如: $dispatcher = $this->container->get('event_dispatcher'); $dispatcher->dispatch(Events::POWERPLANT_GET_DATA, new PowerPlantEvent($thi

我用的是symfony3。我已经创建了一些活动,它们运行良好。但这一新事件是不同的。我必须以某种方式向订户发送一些附加参数。最好的方法是什么?我创建了一个服务来执行这个任务。控制器将调度一个事件,如:

$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命令更好?很好。我没有多少信息可以给你提供有用的建议。我会尝试两种方法,并保留一种更适合你的方法。我个人更喜欢活动。命令(用命令总线的术语)将是更大的架构更改,在这里没有附加值。