发送通知时未使用自定义通知通道

时间:2018-06-20 17:50:11

标签: laravel-5 notifications laravel-5.6

运行:PHP 7.1.3 / Laravel 5.6.*

我已经能够成功使用Laravel提供的通知通道,但是由于某些原因,自定义通知通道并未得到使用。

预期:

调用$user->notify(new ContactResponse())应该会导致PushChannel的send方法被调用。

实际:

当我调用$user->notify(new ContactResponse())时,ContactResponse的via方法(PushChannel)中指定的通道从不调用send,更不用说其构造函数了。

我做了什么:

我已将日志记录语句添加到所有相关方法主体以验证问题并知道:

  • ContactResponse的via方法被调用,但它的toPush没有被调用。
  • PushChannel的构造函数和send方法永远不会被调用。
  • 向ContactResponse的via方法和类中的toMail方法中的通道添加“邮件”确实会在该通道上被调用。

我仔细检查了与此有关的Laravel 5.6文档,发现示例实现与我的实现之间没有任何差异。

我查看了Laravel框架的问题/ PR,发现这表明这是Laravel当前自定义通知渠道实现中的一个问题:

https://github.com/laravel/framework/pull/24223

问题:

我知道Laravel拥有推送通知通道的扩展,但是我们想使用我们的自定义实现。有没有可以利用的替代方法,以便在不修改Laravel源代码的情况下使用PushChannel?


ContactResponse.php

<?php

namespace App\Notifications;

// ...imports

class ContactResponse extends Notification implements ShouldQueue 
{
    use Queueable;

    public function via(User $notifiable)
    {
        return [PushChannel::class];
    }

    public function toPush(User $notifiable)
    {
        return [/*payload*/]
    }
}

PushChannel.php

<?php

namespace App\Channels;

// ...imports

class PushChannel
{
    public function send(User $notifiable, Notification $notification)
    {
        $payload = $notification->toPush($notifiable)
        // business logic
    }
}

1 个答案:

答案 0 :(得分:0)

绝对不是最漂亮的解决方法,但这可以按预期工作,而无需修改Laravel源代码:

public function via(User $notifiable)
{
    // TODO: revert to proper implementation when fixed
    $channels = [PushChannel::class];
    if (in_array(PushChannel::class, $channels)) {
        $pushChannel = App::make(PushChannel::class);
        $pushChannel->send($notifiable, $this);
    }

    // return [PushChannel::class];
}