簡體   English   中英

Symfony2:事件變為監聽器

[英]Symfony2: event changes into listener

在我的“ CustomListeren(.php)”中將我的“ CustomEvent(.php)”類設置為$ event屬性。

在kernel.terminate上,$ event屬性從“ CustomEvent”更改為“ CustomListener”(空對象)。

# CustomEvent.php
namespace Stackoverflow\AwesomeBundle\Event;

use Symfony\Component\EventDispatcher\Event;

class CustomEvent extends Event {

  protected $data;

  /**
   * @param Data $data
   */
  public function __construct(Data $data) {
    $this->data = $data;
  }

  /**
   * @return Data
   */
  public function getdata() {
    return $this->data;
  }
}

# CustomListener.php
namespace Stackoverflow\AwesomeBundle\Event;

class CustomListener {
  /**
   * @var CustomEvent
   */
  protected $event;

  /**
   * @param CustomEvent $event
   */
  public function firstTrigger(CustomEvent $event) {
    // indeed instanceof CustomEvent
    $this->event = $event;
  }

  public function secondTrigger() {
    // $this->event is now instanceof CustomListener instead of CustomEvent

    if ($this->event instanceof CustomEvent) {
      // ... code logic
    }
  }
}

我的控制器

# CustomController
namespace Stackoverflow\AwesomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Stackoverflow\AwesomeBundle\Data;
use Stackoverflow\AwesomeBundle\Event\CustomEvent;

class CustomController extends Controller {
  public function customAction(Request $request) {
   // ... code

   $data = new Data();

   $this->get('event_dispatcher')->dispatch(
     'nameIsNotImportant',
     new CustomEvent($data)
   );

   // ... code
  }
}

我的捆綁軟件services.yml

parameters:
  custom.listener.class: Stackoverflow\AwesomeBundle\Event\CustomListener

services:
  custom_listener:
    class: %custom.listener.class%
    tags:
      - { name: kernel.event_listener, event: nameIsNotImportant, method: firsTrigger }
      - { name: kernel.event_listener, event: kernel.terminate, method: secondTrigger }

我在CustomListener :: secondTrigger()中做了一個get_class($ this-> event),日志顯示$ this-> event變成了CustomListener

[2014-04-25 15:20:16] app.DEBUG: Pointer\Revlect\SecurityBundle\Event\ResetTokenEvent [] []
...
[2014-04-25 15:20:16] app.DEBUG: Pointer\Revlect\SecurityBundle\Event\ResetTokenListener [] []
[2014-04-25 15:20:16] event.DEBUG: Notified event "kernel.terminate" to listener "Stackoverflow\AwesomeBundle\Event\CustomListener::secondTrigger". [] []

在CustomListener :: secondTrigger()中,$ this-> event必須是CustomEvent的實例。 我想念一塊拼圖嗎???

我已將方法名稱從“ sendMail”更改為“ sendsMail”。

因此,如果遇到此類問題,請嘗試更改您的方法名稱。

最好是使用兩個偵聽器執行一個動作,而不是使用該偵聽器執行兩個動作。 那應該解決這個問題。

您在一個偵聽器中使用了兩個不同的Event類,並且在SecondTrigger()您沒有定義它將接收的$event ,因此未正確定義$this->event

最好的選擇是對兩個事件使用兩個偵聽器,但是如果畢竟只想使用一個偵聽器,則應該在secondTrigger()處定義要等待的$event

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM