2015-11-17 124 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);