2016-08-02 12 views
1

私はsymfony 3を使用しています。すでにいくつかのイベントを作成していて、うまく動作しています。しかし、この新しいイベントは異なっています。私はどうにかして加入者にいくつかの追加パラメータを送る必要があります。それをする最善の方法は何ですか?仕事を遂行するためにフェムトサービスを作りました。コントローラは次のようなイベントを送出します:イベントサブスクライバに追加のパラメータを追加する

$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イベントができます:$ディスパッチャ - >ディスパッチ(Events :: POWERPLANT_GET_DATA、新しいPowe rPlantEvent($ this-> getPowerPlantAction($ id))、$ startDate、$ endDate、$ measurement、$ field);それとも別の方法がありますか? – sanof

答えて

0

その

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; 
    } 
} 

のための新しいEventクラスを作成し、

$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)) 
); 

または:あなたの加入者で

$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、私は試して、それは正常に動作します。ドキュメンテーションはこのイベントの部分では貧弱です。私はまた、新しいクラスを作成したり、これをコマンドしたりすることも考えています。このため、私は、流入データベースを使って別のsymfonyアプリケーションからphenastalkの仕事をデータで取得するプロセスを開始しました。イベントはこの機能を実装する最善の方法ですか、カスタムクラスまたはsymfonyコマンドを使用する方が良いでしょうか? – sanof

+0

良い私はあなたに有用な助言を与えるための情報はほとんどありません。私は両方のアプローチを試して、あなたに合ったものを保ちました。私は個人的にイベントを好む。コマンド(コマンドバスの用語で)は、ここで付加価値のないより大きなアーキテクチャ上の変更になります。 –

0

あなたは、イベント自体に必要なすべてのデータを置く必要があり、その後、あなたは簡単にするために、加入者

でそれらにアクセスすることができ、私はプロパティが公開されてと__constructにすべてを追加しましたが、それはあなたがそれを実装する方法はあなた次第です。あなたは、イベントがオプションのパラメータを使用している場合、あなたは

public function onPowerPlantGetData(PowerPlantEvent $event) 
{ 
    $startDate = $event->startDate; // you might want to implement getters for those 
} 
関連する問題