Laravel事件监听器未触发

7

我在Laravel中创建了一个事件和监听器,但监听器没有触发。实际上,在我的同事的机器上它确实被触发了。这让我认为实际代码是可以工作的,并且配置也没问题。

监听器:

<?php

namespace App\Listeners\Consensus;

use App\Events\Consensus\ManualGroupChannelNotificationEvent;
use Illuminate\Support\Facades\Log;

/**
 * Class ManualGroupChannelNotificationListener
 * @package App\Listeners\Consensus
 */
class ManualGroupChannelNotificationListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  ManualGroupChannelNotificationEvent  $event
     * @return void
     */
    public function handle(ManualGroupChannelNotificationEvent $event)
    {
        Log::debug('Listener');
    }
}

事件:

<?php
namespace App\Events\Consensus;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Support\Facades\Log;

/**
 * Class ManualGroupChannelNotificationEvent
 * @package App\Events\Consensus
 */
class ManualGroupChannelNotificationEvent
{
    use Dispatchable;

    /*
     * ExternalComment constructor.
     *
     * @param Comment $comment
     * @param User $currentUser
     */
    public function __construct()
    {
        Log::debug('Event');
    }
}

事件服务提供者:

protected $listen = [
    'App\Events\Consensus\ManualGroupChannelNotificationEvent' => [
        'App\Listeners\Consensus\ManualGroupChannelNotificationListener',
    ],
];

触发事件:

event(new ManualGroupChannelNotificationEvent());

我运行了清除缓存等所有命令,但还是不能正常工作。

php artisan clear-compiled
php artisan config:clear
php artisan cache:clear
composer dump-autoload
php artisan queue:restart

如果这段代码在其他机器上能够正常运行,那么我还需要做什么才能让它在我的机器上工作?

其他信息:

  • 我的日志记录是有效的;事件消息已被记录。
  • 其他类似的事件也是有效的。

1
我在日志中收到了事件消息,但没有收到监听器消息。 - Sherlock
1
希望这篇文章能够帮助到您。https://vegibit.com/8-steps-to-success-with-laravel-events/ - Kaushik Thakkar
你使用的 Laravel 版本是什么? - Udo E.
@UdoE. 版本 6.1.0 - Sherlock
1
Laravel能正确解析您的监听器吗?在tinker中使用class_exists('App\Listeners\Consensus\ManualGroupChannelNotificationListener')app()->make('App\Listeners\Consensus\ManualGroupChannelNotificationListener')进行检查,后者是Laravel从调度程序内部实际解析侦听器的方式。如果返回false或出现错误,请检查文件名是否与类名完全匹配。我曾经遇到过这样的问题,在不区分大小写的文件系统上可以正常工作,但在区分大小写的文件系统上失败了,因为类文件的大小写有误。 - wunch
显示剩余4条评论
3个回答

1

首先,尝试应用chmod -R 777 storage/logs,这可能只是一个授权问题。

也许您的事件注册失败了,您可以尝试将以下内容添加到您的EventServiceProvider中

/**
 * Determine if events and listeners should be automatically discovered.
 *
 * @return bool
 */
public function shouldDiscoverEvents()
{
    return true;
}

你的第二台工作机器和第一台是否相同?

谢谢你的回答。我确实从事件中获取了日志消息,只是没有从监听器中获取,所以日志记录是有效的。不幸的是,添加该方法并没有什么区别。 - Sherlock

1

好的。我在Laravel 5.8中测试了您的设置,通过手动创建类,事件和侦听器都被正确记录。

我建议您避免手动创建事件和侦听器类。相反,首先像您所做的那样在EventServiceProvider.php中指定它们:

protected $listen = [
    'App\Events\Consensus\ManualGroupChannelNotificationEvent' => [
        'App\Listeners\Consensus\ManualGroupChannelNotificationListener',
    ],
];

然后使用这个Artisan命令自动生成必要的类文件。

php artisan event:generate

您现在可以通过包含 use Illuminate\Support\Facades\Log; 指令行并在事件构造函数和侦听器处理程序方法中使用 Log::debug() 方法调用来修改生成的类。请尝试此建议方法,看看是否有效。我认为这不是存储访问权限的问题,因为在您的情况下事件日志已成功记录。

-2

我删除了仓库并重新克隆,现在它可以工作了。


接受自己的答案不会在任何情况下授予悬赏或退还声望值。请确保将悬赏授予给提供了出色答案的其他人。 - Kiran Maniya
你接受了自己的答案!!你应该更新问题本身以帮助其他人。 - Rohit Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接