Laravel 通知监听器在实现队列时没有用

2024-04-26

Laravel 版本:5.5.*

PHP 版本:7.1.*

根据文档https://laravel.com/docs/5.5/notifications https://laravel.com/docs/5.5/notifications#notification-events订阅通知事件应该非常简单。我已按照文档中的步骤操作,但我的通知实现了ShouldQueue并且他们没有正确填充事件侦听器。我想知道这个问题是否是在框架代码中 https://github.com/laravel/framework/blob/5.5/src/Illuminate/Notifications/NotificationSender.php.

请注意,在 github 框架(上面链接)中,new Events\NotificationSent($notifiable, $notification, $channel, $response)仅从sendToNotifiable函数,而该函数又只能从sendNow功能。这send函数本身,是这样的:

public function send($notifiables, $notification)
    {
        $notifiables = $this->formatNotifiables($notifiables);

        if ($notification instanceof ShouldQueue) {
            return $this->queueNotification($notifiables, $notification);
        }

        return $this->sendNow($notifiables, $notification);
    }

也就是说,正如它给我读到的那样,该事件不会开火如果是以下情况if ($notification instanceof ShouldQueue) { as queueNotification从不触发事件侦听器。我假设它进入队列,然后需要重新触发事件,但我不认为这种情况会发生,因为我的NotificationSent侦听器未填充any来自该类构造函数的数据。

事件服务提供者:

 protected $listen = [
       'Illuminate\Notifications\Events\NotificationSent' => [
        'App\Listeners\NewNotificationListener',
    ],

新的通知监听器:

<?php

namespace App\Listeners;

use Illuminate\Notifications\Events\NotificationSent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Jobs\SendEmailForNotifications;
use Illuminate\Support\Facades\Log;
class NewNotificationListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
  public function handle(NotificationSent $event)
{
Log:info('Notification Listener:'.' '.var_dump($event));
SendEmailForNotifications::dispatch($event->notification)->delay(now()->addMinutes(10));   
} 
}

var_dump这里是空的,我的日志中什么也没有,只是Notification Listener:.

所以我的问题是,为什么会这样以及如何在利用队列的同时拥有一个通知事件侦听器,就像我需要做的那样。是我做错了什么还是框架的问题?


快速回答:进行这些修改后,您是否重新启动了队列工作程序?

The NotificationSent在排队和处理时,我的盒子上的事件会按预期触发和捕获。


当 Laravel 敲入这段代码时NotificationSender:

if ($notification instanceof ShouldQueue) {
    return $this->queueNotification($notifiables, $notification);
}

它使用队列调度程序对通知进行排队并将其存储到您的队列中。当你的工作人员拿起它时,它会反序列化命令,然后启动SendQueuedNotifications。然后,此类将处理排队的通知,并处理队列(source https://github.com/laravel/framework/blob/fd88ff8cb242760ad23b7bf547e15a22c8ce73df/src/Illuminate/Notifications/SendQueuedNotifications.php#L55-L58):

public function handle(ChannelManager $manager)
{
    $manager->sendNow($this->notifiables, $this->notification, $this->channels);
}

And ChannelManager做这个 (source https://github.com/laravel/framework/blob/fca0272e61ee2e2e630a40f42ebe0f3e30e75422/src/Illuminate/Notifications/ChannelManager.php#L46-L51):

public function sendNow($notifiables, $notification, array $channels = null)
{
    return (new NotificationSender(
        $this, $this->app->make(Bus::class), $this->app->make(Dispatcher::class))
    )->sendNow($notifiables, $notification, $channels);
}

就这样吧。这sendNow in NotificationSender叫做。这NotificationSent应该在此函数中调用事件。


Edit

我是这样测试的:

  1. 确保您的队列设置正确。我使用数据库队列,以及 jobs/failed_jobs 表组合。

  2. 创建文件app/Listeners/TestListener.php

    <?php
    
    namespace App\Listeners;
    
    use Illuminate\Notifications\Events\NotificationSent;
    
    class TestListener
    {
        public function handle(NotificationSent $event)
        {
            \Log::info(get_class($event));
        }
    }
    
  3. Edit app/Providers/EventServiceProvider.php

    <?php
    
    namespace App\Providers;
    
    use App\Listeners\TestListener;
    use Illuminate\Notifications\Events\NotificationSent;
    use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
    
    class EventServiceProvider extends ServiceProvider
    {
        /**
         * The event listener mappings for the application.
         *
         * @var array
         */
        protected $listen = [
            NotificationSent::class => [
                TestListener::class
            ]
        ];
    }
    
  4. 创建一个虚拟通知(发送一封 Hello 电子邮件):

    <?php
    
    namespace App\Notifications\Users;
    
    use App\Notifications\Notification;
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Notifications\Channels\MailChannel;
    use Illuminate\Notifications\Messages\MailMessage;
    
    class WelcomeNotification extends Notification implements ShouldQueue
    {
        use Queueable;
    
        public function via($notifiable)
        {
            return [MailChannel::class];
        }
    
        public function toMail($notifiable)
        {
            return (new MailMessage())
                        ->line('Hello');
        }
    }
    
  5. 重新启动您的队列工作线程。我只是重新启动我的php artisan queue:work.

  6. 发送通知

    $user->notify(new WelcomeNotification());
    
  7. Check laravel.log,你应该有类名NotificationSent印在那里。

    [2018-03-06 09:51:02] production.INFO: Illuminate\Notifications\Events\NotificationSent  
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 通知监听器在实现队列时没有用 的相关文章

  • 如何在 Laravel 中动态更改 .env 文件中的变量?

    我想创建一个 Laravel Web 应用程序 允许管理员用户使用 Web 后端系统更改 env 文件中的某些变量 例如数据库凭据 但如何保存更改呢 没有内置的方法可以做到这一点 如果您确实想更改其中的内容 env文件 您必须结合 PHP
  • 如果移动到不同的子元素上,MouseEvent.offsetX/Y 重置为 0

    采取以下fiddle http jsfiddle net m3Lmvrc0 它包含一个父 div 和 3 个子 div 单击侦听器附加到父 div 并应根据鼠标相对于父 div 的位置发出警报 const parent document g
  • “路径不能为空”laravel

    我想将 pdf 文件保存在存储文件夹中 但是当我在表单中插入文件并单击按钮时 它会显示错误 路径不能为空 然而 路径并不空 这是我可以执行此操作的函数 public function getFilenametostore Request r
  • 在 Laravel 中获取身份验证用户 ID

    如果用户登录 Laravel 5 1 我们可以访问用户 ID Auth user gt id 在我以前的应用程序 不是 laravel 中 当用户登录时 我正在为 userid 注册一个会话 我正在检查 SESSION user id 是否
  • 如何调用分组精灵的函数?

    我有一个Sprite我在一个小组中上的课 每次单击鼠标按钮时 我想从类中调用一个函数 应该为组中的每个项目调用该函数 我只知道如何调用update组中每个项目的函数 但如果不是在每次鼠标单击时调用该函数 而是在每一帧上调用它 代码会非常慢
  • 如何在 IE 中使用 relatedTarget (或等效项)?

    显然 IE 11 有问题relatedTarget 例如blur事件 IE 有没有替代方法来获取relatedTarget 下面是一个在 IE 中产生错误的示例 https jsfiddle net rnyqy78m https jsfid
  • 更改laravel视图页面中的日期格式[重复]

    这个问题在这里已经有答案了 我想更改从数据库获取的日期格式 现在我得到了 2016 10 01 user gt from date 我想更改 laravel 5 3 中的格式 d m y user gt from date gt forma
  • 动态插入的 jQuery 库加载完成后执行我的 jQuery 脚本

    我通过以下方式在页面上动态插入 jQuery 库
  • 如何将参数传递给事件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我的一些变量没有在每次方法调用时被序
  • Laravel 完整日历

    我正在尝试按照本教程进行操作https laravelcode com post laravel full calendar tutorial example using maddhatter laravel fullcalendar ht
  • node npm run watch 退出状态 3221225725

    我必须格式化我的驱动器 但我的一个项目不再工作 所有其他相同类型的项目都运行良好 这是 Laravel Vue JS 问题是我无法运行 npm run watch dev 或 production 他们都给出了错误 拉拉维尔 5 7 npm
  • 是否可以删除Android日历事件

    我正在使用 Android 日历 如何使用代码删除日历事件 是否可以 为了澄清起见 我想提一下 我不想要同步过程或想要使用 gdata api 删除事件 我只想删除本地日历事件 尝试使用事件 ID 的 Uri 删除事件 Uri uri UR
  • 如何在 Laravel 中更改应用程序的命名空间?

    我无法在 Laravel 5 8 中更改应用程序的命名空间 我正在使用 artisan 来更改它 php artisan app name TestApp 结果是 中没有定义命令app 命名空间 看着php artisan你应该有一个php
  • Java - 创建自定义事件和侦听器

    我正在尝试用 Java 创建自定义事件和侦听器 我已经看过这些文章和问题 在 Java 中创建自定义事件 https stackoverflow com questions 6270132 create a custom event in
  • {{ Auth::user()->name }} 如何在 Blade 文件中打印用户名?

    我一直在 laravel 中使用默认身份验证功能 我在一个刀片文件中发现 Auth user gt name 能够显示存储在用户表中的名称 但我想知道的是它是如何显示的用雄辩的口号在刀锋中呼唤名字 你可以像这样使用它 auth gt use
  • Blade @if 中的 Laravel 会话变量

    当我尝试使用 Laravel Session 在刀片中设置 JS 变量来刷新一些数据时 我在 Laravel 4 2 中遇到了一些奇怪的情况 这很简单 我不知道我错过了什么 目标 在用户注册后立即触发 Javascript 网站浏览 方法
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • .htaccess 异常导致主目录出现问题

    这是我的目录结构 localhost or livehost app bootstrap public vendor code demo 这是我的 htaccess
  • 在 Eloquent 中定义自定义属性

    我的数据库中有 3 个不同的字段 city state country 如何在 Eloquent 中定义另一个属性以从这 3 个字段返回一个字符串 第一种方法 但不起作用 protected address public function
  • 这个条带请求是什么?为什么它会多次触发?

    对于使用 stripe 的 Laravel 应用程序 此请求https r stripe com 0被解雇多次 如下所示 我刷新主页后 这些请求立即被触发 问题是我最近得到了一个429 too many requests我的实时服务器出现错

随机推荐

  • 如何使用程序集绑定重定向来忽略修订号和内部版本号

    我有几个 C NET 应用程序 以及供它们访问数据库的 API 我想将 API 的所有版本放入数据库中 并让它们选择最高版本和内部版本号 但坚持使用它们构建时使用的主要版本号和次要版本号 基本上当我参考API时1 2 3 4我想要参考阅读1
  • 基于github仓库的本地仓库创建本地git仓库并保持更新

    我有一些基本的 git 知识 但我不知道如何实现这一点 我正在尝试克隆 github WordPress 入门主题下划线 https github com automattic s 这个想法是创建一个基本框架based 经过一些修改 在该存
  • 无法将 PHP 表单放入表格中

    我创建了一个工作正常的表单 但是当我将其放入表格中时 它总是认为该表单不完整 有没有办法可以将其放入表格中 这样看起来不错 而不会出现此问题 我的 HTML h2 class green Interested in making life
  • .Net Core Web Api 异步不重要吗?

    我一直在编写我的 Web Api 控制器方法async关键字并一直在使用async一直往下 我最近尝试创建一个方法同步来看看它会如何影响性能 并惊讶地发现它对任何其他 http 请求都没有阻塞影响 举个例子 Route Foo class
  • aws key 和 Secret 在 aws cli 上工作但在 jenkins 上不起作用

    我正在尝试运行 python 脚本 其中包含使用 boto3 sdk 访问 s3 的代码 我已经在我的 Windows 机器中创建了默认配置文件 aws cli 命令在窗口 cmd 中可以正常工作以访问 s3 存储桶 python 脚本在窗
  • PHP 计算 JSON 请求中返回的项目数?

    我正在寻找一种方法来计算在搜索数据库时得到的这些 JSON 字符串中返回的项目数 以 PHP 表示 请原谅我 因为我对这一切一无所知 有人告诉我 因为 JSON 版本中没有返回计数 就像此数据库中的 XML 版本一样 我必须使用循环来计算结
  • 简单的http服务器

    好吧 这可能是一个愚蠢的问题 但关于节点 我已经尽我所能了 我设置了一个服务器 使用我们可以在任何节点演示或教程中找到的代码 var http require http var server http createServer functi
  • 如何在VueJS中将所有事件传递给父级

    传递道具 In VueJS如果你设置inheritAttrs to false并使用v bind attrs 您将组件中未声明的所有 props 传递给其子组件 是否有类似的方法将来自子级的所有事件传递给其父级VueJS 代码示例 Wrap
  • 无法加载 Spring ApplicationContext

    我正在为一个有点复杂的 spring 应用程序编写单元测试 我想加载 spring 上下文以便使用定义的 bean 我的 context xml 位于 src main resources context xml Maven 构建后 con
  • Keras模型拟合多项式

    我从四次多项式生成了一些数据 并希望在 Keras 中创建一个回归模型来拟合该多项式 问题是拟合后的预测似乎基本上是线性的 由于这是我第一次使用神经网络 我认为我犯了一个非常微不足道且愚蠢的错误 这是我的代码 model Sequentia
  • 基于程序描述的多线程推荐

    我想描述我的程序的一些细节 并获得有关最适用的最佳多线程模型的反馈 我现在花了很多时间阅读有关 ThreadPool Threads Producer Consumer 等的内容 但尚未得出可靠的结论 我有一个文件列表 格式相同 但内容不同
  • 将 best_in_place 与富文本编辑器(如 TinyMCE)一起使用

    我正在使用best in placegem 在 Rails 应用程序中进行就地编辑 但是 我需要对某些文本区域进行 X HTML 编辑 因此我需要一个富文本编辑器 TinyMCE 正在该网站的其他地方使用 然而 添加一个编辑器并不简单bes
  • 有没有办法扩展 PHP 中的特征?

    我想使用现有的功能trait并创建我自己的trait在此之上只是为了稍后将其应用到课堂上 我想延长Laravel SoftDeletes特质SaveWithHistory函数 因此它将创建一个记录的副本作为已删除的记录 我也想扩展它reco
  • 我无法通过引用捕获传递 lambda

    以下代码失败并出现此错误 E0413 不存在从 lambda float int i gt float 到 float int i 的合适转换函数 int test float f int i int i gt float return t
  • 使用 Asp.net/C# 使用 USB 令牌对文本文件进行数字签名?

    我有一个 USB 令牌 Epass Capricorn 我的要求是使用它来签署文本 平面文件 PS 我相信我必须从代 码中获取 START SIGNATURE START CERTIFICATE 和 SIGNER VERSION 数据并附加
  • 模拟器卡在从 10.0.2.2:8081 加载时,有什么问题吗?

    I am working on a react native project and I run it on emulator android AVD manager 我跑了adb 反向 tcp 8081 tcp 8081在 cmd 但我的
  • Visual Studio Code 中的“Markdown 片段链接导航”是什么?

    Visual Studio Code 2017 年 2 月 版本 1 10 发行说明描述了他们所谓的 Markdown 片段链接导航 这是描述 包含片段的 Markdown 文件的链接现在将尝试打开相应标题处的文件 Section head
  • Bootstrap 4 导航栏折叠菜单右对齐

    我正在使用 Bootstrap 4 我试图通过单击折叠按钮在右侧而不是左侧打开来弹出菜单 我尝试在 ul 元素上使用 ml auto 当导航栏未折叠时 导航栏项目正确位于右侧 当它折叠时 按钮正确地位于右侧 但菜单在左侧弹出 我也尝试过将
  • 一般:如何更改 Android 核心 API 类?

    这只是一个一般性问题 供我参考 我知道如何创建标准的 Android 应用程序 但我想知道 这怎么可能 人们如何增强 Android 核心功能并深入挖掘系统 例如 假设我想调整下载管理器 http developer android com
  • Laravel 通知监听器在实现队列时没有用

    Laravel 版本 5 5 PHP 版本 7 1 根据文档https laravel com docs 5 5 notifications https laravel com docs 5 5 notifications notifica