2015-11-17 175 views
2

我有一個Lumen控制器類,在創建用戶時觸發事件。我正在使用事件調度程序。事件被激發,但聽衆不處理事件。 我確定我已經遵循了Lumen文檔的每一步。Laravel/Lumen事件監聽器不聽

// UserController.php 
class UserController extends ApiController 
{ 
    protected $event = null; 

    public function __construct(Dispatcher $event) 
    { 
     $this->event = $event; 
    } 

    /** 
    * Store a newly created resource in storage. 
    * 
    * @param Request $request 
    * @return Response 
    */ 
    public function store(Request $request) 
    { 
     $this->acceptContentType($request, 'json'); 

     $this->input = $request->json()->all(); 
     $this->withEncryptedParameters(); 

     $this->validateParameterNames(array_keys($this->validationRules)); 
     $this->validateParameterContent($this->validationRules); 

     $roles = $this->getRelationInput('roles'); 

     $user = User::create($this->input); 
     $this->addRelation($user, $roles, Role::class, 'roles'); 

     $this->event->fire(new UserCreated($user)); 

     return $this->respondCreated($user->id); 
    } 
} 

因此,我基本上想要將用戶存儲到數據庫中,並在發生這種情況時觸發事件。

// UserCreated.php 
class UserCreated extends Event 
{ 
    public $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 
} 

該事件被解僱正確的,所以如果我把一個「回聲」或「的var_dump」到事件的構造函數中,我可以看到,它的工作原理。如果我對聆聽者如此相同,它就不會有反應。

// UserCreatedEmail.php 
class UserCreatedEmail extends Listener 
{ 
    public function handle(UserCreated $event) 
    { 
     echo 'Hello?'; 
    } 
} 

我已經在EventServiceProvider中註冊了它。

// EventServiceProvider.php 
class EventServiceProvider extends ServiceProvider 
{ 
    /** 
    * The event listener mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     UserCreated::class => [ 
      UserCreatedEmail::class 
     ] 
    ]; 
} 

並在bootstrap區域取消註釋。

// bootstrap/app.php  
$app->register(WISSIT\UserService\Providers\EventServiceProvider::class); 

我完全不知道爲什麼不起作用。我可以使用「$ event-> listen」,但當我使用測試時,它也會聽。根據Lumen文件,它也應該沒有這個工作。

是的,名稱空間設置正確。不,我不想使用Facades。

+0

順便說一句,我的默認命名空間是不是 「應用程序」,它的 「WISSIT \ UserService」,但是這不應該的問題。 – Florian

回答

0

好的,所以它看起來像只在事件在控制器中使用\Illuminate\Contracts\Event\Dispatcher時纔會收聽。我用\Illuminate\Events\Dispatcher。我不知道爲什麼是這樣,但它的工作。

0

我想我已經得到了這個問題,所以這是我如何解決此問題:

在你EventServiceProvider改變事件類和監聽器類,以一個真實的路徑,在不使用EventServiceProvider::class。即:

// EventServiceProvider.php 
class EventServiceProvider extends ServiceProvider 
{ 
    /** 
    * The event listener mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     'WISSIT\UserService\Events\UserCreated' => [ 
      'WISSIT\UserService\Listeners\UserCreatedEmail' 
     ] 
    ]; 
} 
+0

不幸的是: - /我剛剛通過(new UserCreatedEmail()) - > handle($ this)在事件的構造函數中調用偵聽器; – Florian

0

我在處理流明和事件偵聽器時遇到了類似的問題。被解僱的事件從未到達我的自定義聽衆,而我一直在努力尋找問題出在哪裏。

最後我發現,我的聽衆上有一個handle方法的錯誤簽名。這是我的錯,但Dispatcher沒有通知我這個問題。當我改變方法來接受給定的參數時,它纔開始工作。

我認爲問題出在在fire方法。如果方法的簽名是錯誤的,函數call_user_func_array將返回false,但調度程序在錯誤時剛剛跳出循環。並不通知用戶有關問題。

3

在'註冊服務提供商'註釋下的bootstrap/app.php註釋掉服務提供商的註冊。

// $app->register(App\Providers\EventServiceProvider::class); 

$app->register(App\Providers\EventServiceProvider::class);