11

使用 Laravel 5.3 通知功能,我看到通知是这样发送给用户的:

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

我认为$user是应通报实体。如果我想向还没有帐户的用户发送通知怎么办?在我的应用程序中,用户向他们的朋友发送加入邀请。我正在尝试使用 Laravel 的通知将邀请码发送给还没有帐户的用户。

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

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 吗?

4

6 回答 6

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

于 2019-02-19T08:03:39.460 回答
14

我发现你的帖子正在寻找同样的东西,但我自己回答了。

你需要use Notifiable;Invite模型上。

然后您导入use Illuminate\Notifications\Notifiable;并且应该能够->notifyInvite模型上使用。

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

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

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

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

于 2016-11-27T12:05:18.617 回答
3

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

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

于 2016-12-01T21:38:13.237 回答
1

我只是想出了一个更简单的方法。首先,您必须覆盖 RegisterController 类中的“注册”功能。为了做到这一点:

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', 'Thanks for registering! Check your inbox for the activation link');

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

protected $data;

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

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

于 2017-04-22T14:02:00.097 回答
0

我有类似的问题,我可以通过使用\Illuminate\Notifications\AnonymousNotifiable. 该对象被序列化,不需要任何数据库基础设施,并且可以与队列一起使用。

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

您还可以在返回以下实例的route类上调用静态函数:\Illuminate\Support\Facades\NotificationAnonymousNotifiable

Notification::route('mail', ['scott.tiger@domain.com' => 'Scott Tiger'])->notify(new NotificationExample());
于 2020-10-20T07:28:53.550 回答
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

于 2021-07-08T07:22:17.843 回答