【问题标题】:Have no idea why the listener is not being called in Laravel不知道为什么在 Laravel 中没有调用监听器
【发布时间】: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 optimize
  • composer dump-autoload

什么都没有。

它是这样称呼的:

    // Create the health care provider user:
    event(new CreateHealthCareProviderEvent($request->all()));

有什么想法吗?我检查了拼写和命名空间,一切似乎都是正确的。我错过了什么?

没有错误,什么都没有。测试仍然通过(我不伪造事件)并且测试覆盖显示事件被调用,但测试覆盖显示监听器没有被调用。当我在浏览器中尝试此操作时,不会创建任何用户 - 这是由侦听器完成的。

我的所有其他事件及其关联的侦听器都可以正常调用。

发生了什么事?

【问题讨论】:

  • 您是否在 EventServiceProvider 中为这些类起别名?
  • @lagbox 不,它们是使用use 语句引入的。我为我所有的事件和听众这样做,这些是唯一没有被调用的听众。
  • 知道了,use 语句是别名...只是想确保它是被引用的正确类,因为这将是事件与侦听器不匹配的首要原因
  • 可能是操作码缓存问题?
  • 不要使用操作码缓存@AkenRoberts

标签: php laravel


【解决方案1】:

所以我很迟钝,会对此投反对票,但为了将来参考,请确保您的使用声明是正确的。因为 Laravel 在注册事件时不会告诉你:

use App\Modules\Clinicians\CreateHealthCareProviderEvent;
use App\Modules\Clinicians\EmailClinicAdminsEvent;
use App\Modules\Clinicians\CreateHealthCareProviderListener;
use App\Modules\Clinicians\EmailClinicAdminsListener;

您认为这里缺少什么?让我告诉你:

use App\Modules\Clinicians\Events\CreateHealthCareProviderEvent;
use App\Modules\Clinicians\Events\EmailClinicAdminsEvent;
use App\Modules\Clinicians\Listeners\CreateHealthCareProviderListener;
use App\Modules\Clinicians\Listeners\EmailClinicAdminsListener;

这就是调用事件而不是侦听器的原因。在调用相关事件的控制器类中,我正确导入了事件,但在事件服务提供者中我没有。

【讨论】:

  • 这就是为什么您必须在代码中提供 use 语句以便其他人可以验证这一点,而不是相信您的话 :)
  • +1 lagbox 点赞。此外,如果您没有使用诸如 PhpStorm 之类的 IDE,我绝对建议您使用一个!他们会帮助指出这样的事情。
  • @TheWebs 不需要投票,您回答了自己的问题,希望这种情况更频繁地发生:p
  • 我不知道在这种情况下,智障是不是一个很好的词。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2014-05-27
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多