Laravel 5.3 向没有帐户的用户发送通知

Laravel 5.3 Send Notification to Users without an account

使用 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 class 而不是 Notification 吗?

我发现你的post也在找同样的东西,但我自己回答了。

您需要 use Notifiable; Invite 型号。

然后您导入 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 并在通知模板中使用它。

通知旨在发送到 notifiable 对象。您不会“通知”邀请。

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

我只是想出了一个更简单的方法。首先,您必须覆盖 RegisterController class 中的 '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)); //调用指定通知class
  3. return redirect()->to('/')->with('msg', 'Thanks for registering! Check your inbox for the activation link');

接下来,配置您的通知 class 以处理消息发送。我在构造函数中做了类似的事情;

protected $data;

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

我希望这对某人有所帮助。

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

我不认为这是针对这种特殊情况的正确方法,但是对于所写的问题,并且由于该线程提供了一些不同的方式来通知不存在的用户,我想我会把它写在这里。

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

请注意,此解决方案在排队通知时可能会出现问题(因为它未引用特定的用户 ID)。

在 Laravel >=5.5 中,可以创建一个 "on-demand notification",它涵盖了您想要通知非现有用户。

来自文档的示例:

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

这会把通知发到邮箱,那个方法可以排队等等

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

我有类似的问题,我可以通过使用 \Illuminate\Notifications\AnonymousNotifiable 的实例来解决它。此对象被序列化并且不需要任何数据库基础结构并且可以使用队列。

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

您还可以在 class \Illuminate\Support\Facades\Notification 上调用静态函数 route,其中 returns 是 AnonymousNotifiable:

的一个实例
Notification::route('mail', ['scott.tiger@domain.com' => 'Scott Tiger'])->notify(new NotificationExample());

在 Laravel 5.5 及更高版本中,您现在可以使用按需通知,将以下代码片段添加到您的控制器或观察器中

Notification::route('mail', 'johndoe@example.com')->notify(new InvoicePaid($invoice))

route('mail', 'johndoe@example.com')表示使用邮件通道并使用johndoe@example.com作为to-email

别忘了导入 Illuminate\Support\Facades\Notification