Laravel 5.3 发送通知给没有账户的用户

13

使用 Laravel 5.3 的通知功能,我发现通知是以这种方式发送给用户的:

$user->notify(new InvoicePaid($invoice));

我认为$user是可通知实体。如果我想要向尚未拥有帐户的用户发送通知怎么办?在我的应用中,用户可以邀请他们的朋友加入。我正在尝试使用Laravel的通知功能将邀请码发送给尚未拥有帐户的用户。

当用户邀请某人时,他们的数据将存储在邀请模型中,如下所示:

class Invite extends Model
  {
    protected $table = 'invites';
    protected $fillable = array('name', 'email', 'invite_code', 'expires_at', 'invited_by');
    protected $dates = ['expires_at'];
   }

我曾以为我可以使用notify方法像这样向Invite模型发送通知:

$invite = Invite::find($inviteId);
$invite->notify(new InvitationNotification(ucfirst($invite->name), $invite->invite_code, $invite->expires_at));  

但是上面的方法不起作用。我收到了错误消息:

Call to undefined method Illuminate\Database\Query\Builder::notify()

因此,我的问题是:

  1. 我是否能够仅向用户模型发送通知?

  2. 有没有办法向尚未拥有帐户的新用户发送通知?

  3. 在这些情况下,我唯一的选择是使用 Laravel 的 Mailable 类而不是 Notification 吗?

6个回答

16

我找到了你的帖子,寻找相同的东西,但是我自己回答了它。

您需要在Invite模型上使用Notifiable;

然后,导入use Illuminate\Notifications\Notifiable;,就应该能够在Invite模型上使用->notify

$invite = Invite::create([
    'name' => $request->get('name'),
    'email' => $request->get('email'),
    'token' => str_random(60),
]);

$invite->notify(new UserInvite());

这是我处理发送通知的方式 :)

然后,您可以通过$invite传递并在通知模板中使用它。


16

一些替代方案可能是仅新建一个用户模型并设置电子邮件属性,而不保存它。现在可以通知该实例。

我认为这不是这种特定情况的正确方法,但对于写作的问题,并且由于此线程提供了一些不同的通知不存在用户的方法,所以我在这里写下了它。

$invitedUser = new User;
$invitedUser->email = 'invite@me.com';
$invitedUser->notify(new InvitationNotification());

请注意,这种解决方案可能会在排队通知时造成问题(因为它没有引用特定的用户ID)。

在 Laravel >=5.5 中,可以使用“按需通知”来处理这种情况,即当您想要通知一个不存在的用户时。

文档中的示例:

Notification::route('mail', 'taylor@example.com')
        ->route('nexmo', '5555555555')
        ->notify(new InvoicePaid($invoice));

这将向电子邮件地址发送通知,可以通过该方法排队等待处理。

文档:https://laravel.com/docs/5.5/notifications#on-demand-notifications


3

通知应该发送到一个可通知对象。您不应该“通知”一个邀请。

如果您只想给某个人发送电子邮件,告诉他们被邀请使用某个应用程序,那么只需向该电子邮件地址发送电子邮件即可。在这种情况下,通知并不适用。


1
谢谢@martin。从逻辑上讲,这确实是有道理的。我之所以尝试使用通知是因为可以轻松地在标准电子邮件模板中添加文本和HTML,并添加数据库条目。但是,是的,我明白可邮寄类可能更合适,因为这不是真正的用户通知。 - Neel
你可以使邀请模型成为可通知的。 - chrisbjr
@chrisbjr 但这有意义吗?你通知邀请者?还是通知受邀者? - Martin Bean
您可以使任何模型可通知 - 我不认为您应该仅限于“通知”用户。虽然在这种情况下,如果您确实有一个“邀请”模型,那么值得重新考虑该模型肯定会附加某种类型的“用户”。在这种情况下,您可以执行 $invitation->user->notify(new WhateverNotification) - chrisbjr
1
@chrisbjr 是的。这就是为什么我说你最有可能通知邀请的接收者,而不仅仅是“通知”邀请本身。这没有任何意义。 - Martin Bean

2

我曾遇到类似问题,通过使用\Illuminate\Notifications\AnonymousNotifiable的实例来解决。这个对象被序列化并不需要任何数据库基础设施,并且可以与队列一起使用。

$anonymousNotifiable = new AnonymousNotifiable();
$anonymousNotifiable->route('mail', ['scott.tiger@domain.com' => 'Scott Tiger']);
$anonymousNotifiable->notify(new NotificationExample());

你也可以在类\Illuminate\Support\Facades\Notification上调用静态函数route,它将返回一个AnonymousNotifiable实例。
Notification::route('mail', ['scott.tiger@domain.com' => 'Scott Tiger'])->notify(new NotificationExample());

这应该是被接受的答案。使用AnonymousNotifiable比创建一个假的用户模型并不持久化它更安全和更干净。 - Cyril

1

我刚刚想出了一种更简单的方法。首先,您需要在RegisterController类中覆盖'register'函数。为了做到这一点:

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;

public function register(Request $request)
{


}

在您的注册函数中添加以下代码:
  1. $user = $this->create($request->all()); //创建并保存用户
  2. $user->notify(new NewRegistrationNotification($request)); //调用指定的通知类
  3. return redirect()->to('/')->with('msg', '感谢您的注册!请检查你的收件箱以获取激活链接。');
接下来,配置您的通知类以处理消息发送。我在构造函数中执行类似以下的操作;
protected $data;

public function __construct(Request $request)
{
     $this->data = $request;
}

我希望这能帮助到某些人。

是的,但在1中,您正在创建一个可通知对象User。但我的原始问题是要向根本不存在的用户发送通知。不过还是感谢您的回答。 - Neel
你可以在应用程序中创建一个匿名用户。然后,每当您想要使用通知发送邀请时,您可以实例化“匿名”实例。我相信目标邮件可以配置为您的目标电子邮件地址。很抱歉我还没有尝试过,因为没有附加代码。如果您仍然需要我测试,请告诉我。 - Pendragon

0
在 Laravel 5.5 及以上版本中,您现在可以使用按需通知,在您的控制器或观察者中添加以下代码片段:
``` Notification::route('mail', 'johndoe@example.com')->notify(new InvoicePaid($invoice)) ```
其中route('mail', 'johndoe@example.com')表示使用邮件通道,并将 johndoe@example.com 作为收件人电子邮件。
不要忘记导入Illuminate\Support\Facades\Notification

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