2016-09-27 5 views
0

Le code suivantabonné Symfony EventDispatcher ne fonctionnent pas

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

il suppose d'envoyer un événement TransactionCreated et se faire prendre par la classe elle-même et la fonction onCreatedNewTransaction s'appeler afin de définir les propriétés de la classe.

La classe Transaction instancié comme

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

mais quand je déboguer le projet l'objet $Transaction ont null valeurs. J'ai placé une méthode breakpoint à onCreateNewTransaction et j'ai trouvé que ainsi la fonction n'est pas invoquée.

MISE À JOUR

Problème résolu

`onCreateNewTransaction » devraient être rendus publics au lieu de privé

+0

Il se peut que je manque quelque chose, mais pourquoi avez-vous besoin d'un événement dans ce scénario? Cela n'aurait-il pas plus de sens d'assigner ces propriétés au constructeur? En dehors de cela, vous devez injecter EventDispatcher au lieu de l'instancier dans le constructeur, de cette façon vous créez une dépendance fixe. –

Répondre

2

Votre méthode CreateNewTransaction est statique, aucun cas de Transaction est créé et donc __constructor est jamais appelé.

Cela concerne pourquoi ce code ne fonctionne pas.

Mais, d'ailleurs, je dois dire que c'est un mauvais usage total du système Event de Symfony. À l'aide de l'infrastructure (pas de composant EventDispatcher), vous ne devez pas créer EventDispatcher vous-même. Il est en train d'être créé par FrameworkBundle et vous ne devez injecter que le service event_dispatcher dans tout ce dont vous avez besoin.

Sinon, vous pouvez vous perdre très rapidement avec des portées différentes (chaque répartiteur a ses propres abonnés et ses propres événements), et de plus, c'est un gaspillage de ressources.

+0

à propos de votre première préoccupation, ma session de débogage prouve le contraire. Le __constructeur protégé est appelé avec toutes les données appropriées injectées. À propos de votre deuxième problème, j'instancie un seul «EventDiaspatcer» à ma racine de composition (alias bootstrap) et j'injecte là où il le faut. Ce 'nouveau' au constructeur est seulement à des fins lisibles. – dios231

+0

De toute façon, lorsque vous créez une transaction comme ceci '$ Transaction = Transaction :: CreateNewTransaction ('6/6/2016', 'John' ....);' Personne ne déclenche cet événement dans votre méthode statique. Et quand vous créez une instance 'Transaction', une nouvelle transaction est en cours de création, mais avec des valeurs nulles - que vous voyez dans votre débogueur –

+0

Je voulais juste souligner qu'il y a des moments où la création de vos propres répartiteurs d'événements est légitime. Cela peut en fait aider à isoler vos auditeurs du reste des auditeurs du framework. Donc, ne l'excluez pas complètement. – Cerad