2016-09-27 15 views
0

Следующего кодаSymfony EventDispatcher абонент не работает

use Application\Events\TransactionCreatedEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\EventDispatcher\EventDispatcher; 

class Transaction implements EventSubscriberInterface 
{ 
    protected $date; 
    protected $name; 
    protected $address; 
    protected $phone; 
    protected $price_with_vat; 
    protected $transaction_type; 
    protected $receipt; 
    protected $currency; 


    protected function __construct($date, $name, $address, $phone, $price_with_vat, $transaction_type, $receipt, $currency) 
    { 
     $dispatcher = new EventDispatcher(); 
     $dispatcher->addSubscriber($this); 
     $dispatcher->dispatch(TransactionCreatedEvent::NAME, new TransactionCreatedEvent($date, $name, $address, $phone, $price_with_vat, $transaction_type, $receipt, $currency)); 
    } 

    public static function CreateNewTransaction($date, $name, $address, $phone, $price_with_vat, $transaction_type, $receipt, $currency){ 
     return new Transaction($date, $name, $address, $phone, $price_with_vat, $transaction_type, $receipt, $currency); 
    } 

    private function onCreateNewTransaction($Event){ 
     $this->date = $Event->date; 
     $this->name = $Event->name; 
     $this->address = $Event->address; 
     $this->phone = $Event->phone; 
     $this->price_with_vat = $Event->price_with_vat; 
     $this->transaction_type = $Event->transaction_type; 
     $this->receipt = $Event->receipt; 
     $this->currency = $Event->currency; 
    } 

    public static function getSubscribedEvents() 
    { 
     return array(TransactionCreatedEvent::NAME => 'onCreateNewTransaction'); 
    } 
} 

это предполагает, чтобы направить TransactionCreated события и поймано сам классом и функциями onCreatedNewTransaction получить ссылаться, чтобы установить свойство класса.

Transaction класса инстанцирован как

$Transaction = Transaction::CreateNewTransaction('6/6/2016', 'John'....); 

но когда я отладка проекта $Transaction объекта имеет null значения. Я установил breakpoint по методу onCreateNewTransaction, и я обнаружил, что при этом функция не вызывается.

ОБНОВЛЕНО

Проблема решена

`onCreateNewTransaction» должен быть публичным, а не частным

+0

Возможно, мне что-то не хватает, но зачем вам нужно событие в этом сценарии? Не имеет смысла просто назначать эти свойства в конструкторе? Кроме того, вы должны вводить EventDispatcher вместо того, чтобы вводить его в конструктор, таким образом вы создаете фиксированную зависимость. –

ответ

2

Ваш метод CreateNewTransaction является статическим, так что никакие случаи Transaction не создается, и поэтому __constructor никогда называется.

Это касается того, почему этот код не работает.

Но, кроме того, я должен сказать, что это полное злоупотребление системы Symfony. Используя framework (нет компонента EventDispatcher), вы не должны создавать EventDispatcher самостоятельно. Это создаётся FrameworkBundle, и вы должны только вводить услугу event_dispatcher в то, что вам нужно.

В противном случае вы можете быстро потеряться с различными областями (у каждого диспетчера есть свои собственные подписчики и его собственные события), и, кроме того, это пустая трата ресурсов.

+0

о вашей первой заботе мой сеанс отладки доказывает обратное. Защищенный __constructor вызывается со всеми соответствующими данными. О вашей второй заботе я создаю экземпляр одного «EventDiaspatcer» в моем корневом составе (aka bootstrap) и впрыскиваю туда, где ему нужно. Этот «новый» при конструкторе - только для разборчивых целей. – dios231

+0

Во всяком случае, когда вы создаете транзакцию, подобную этой '$ Transaction = Transaction :: CreateNewTransaction ('6/6/2016', 'John' ....),' nobody запускает это событие в вашем статическом методе. И когда вы создаете экземпляр «Transaction», создается новая транзакция, но с нулевыми значениями, которую вы видите в своем отладчике. –

+0

Просто хотел указать, что бывают случаи, когда создание собственных диспетчеров событий является законным. Это может действительно помочь изолировать ваших слушателей от остальных слушателей структуры. Так что не исключайте это полностью. – Cerad