运行:PHP 7.1.3
/ Laravel 5.6.*
我已经能够成功使用Laravel提供的通知通道,但是由于某些原因,自定义通知通道并未得到使用。
预期:
调用$user->notify(new ContactResponse())
应该会导致PushChannel的send方法被调用。
实际:
当我调用$user->notify(new ContactResponse())
时,ContactResponse的via
方法(PushChannel)中指定的通道从不调用send
,更不用说其构造函数了。
我做了什么:
我已将日志记录语句添加到所有相关方法主体以验证问题并知道:
via
方法被调用,但它的toPush
没有被调用。send
方法永远不会被调用。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
}
}
答案 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];
}