【发布时间】:2020-02-09 08:03:18
【问题描述】:
活动如下:
<?php
namespace App\Modules\Clinicians\Events;
use Illuminate\Queue\SerializesModels;
class CreateHealthCareProviderEvent
{
use SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(array $data)
{
$this->data = $data;
}
}
事件被调用就好了。但听者:
<?php
namespace App\Modules\Clinicians\Listeners;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Modules\Clinicians\Events\CreateHealthCareProviderEvent;
use App\Modules\Clinicians\Events\EmailClinicAdminsEvent;
use App\Modules\Users\Services\RegisterUserService;
class CreateHealthCareProviderListener
{
private $registerUserService;
/**
* Create the event listener.
*
* @return void
*/
public function __construct(RegisterUserService $registerUserService)
{
$this->registerUserService = $registerUserService;
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(CreateHealthCareProviderEvent $event)
{
$user = $this->registerUserService->setRequestData($event->data)->registerUser(Clinic::find($event->data['clinic_id']));
$user->clinician()->create([
'user_id' => $user->id,
]);
$user->clinician->clinics()->attach($event->data['clinic_id']);
event(new EmailClinicAdminsEvent($user, $event->data['clinic_id']));
}
}
永远不会被调用。曾经。那么我该如何注册呢?
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
// When a new health care provider registers:
CreateHealthCareProviderEvent::class => [
CreateHealthCareProviderListener::class,
],
// Email the Clinic admins when a healthcare provider registers:
// Called in the CreateHealthCareProviderListener handler method.
EmailClinicAdminsEvent::class => [
EmailClinicAdminsListener::class,
],
];
...
}
我以前从未遇到过像这样注册事件和侦听器的问题。他们总是工作。但是由于某种原因,侦听器不会为此事件触发。事件触发得很好。但不是听者。我错过了什么?
我试过了:
php artisan optimizecomposer dump-autoload
什么都没有。
它是这样称呼的:
// Create the health care provider user:
event(new CreateHealthCareProviderEvent($request->all()));
有什么想法吗?我检查了拼写和命名空间,一切似乎都是正确的。我错过了什么?
没有错误,什么都没有。测试仍然通过(我不伪造事件)并且测试覆盖显示事件被调用,但测试覆盖显示监听器没有被调用。当我在浏览器中尝试此操作时,不会创建任何用户 - 这是由侦听器完成的。
我的所有其他事件及其关联的侦听器都可以正常调用。
发生了什么事?
【问题讨论】:
-
您是否在
EventServiceProvider中为这些类起别名? -
@lagbox 不,它们是使用
use语句引入的。我为我所有的事件和听众这样做,这些是唯一没有被调用的听众。 -
知道了,
use语句是别名...只是想确保它是被引用的正确类,因为这将是事件与侦听器不匹配的首要原因 -
可能是操作码缓存问题?
-
不要使用操作码缓存@AkenRoberts