【问题标题】:Laravel 5.3 Send Notification to Users without an accountLaravel 5.3 向没有帐户的用户发送通知
【发布时间】:2017-04-08 09:15:08
【问题描述】:

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

【问题讨论】:

    标签: laravel laravel-5.3 laravel-mail laravel-notification


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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());
      

      【讨论】:

        【解决方案3】:

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

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

        $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

        【讨论】:

          【解决方案4】:

          我只是想出了一个更简单的方法。首先,您必须覆盖 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;
          }
          

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

          【讨论】:

          • 是的,但是在1 中,您正在创建一个User,它是可通知对象。但我最初的问题是向根本没有创建的用户发送通知。不过感谢您的意见。
          • 如何在您的应用程序中创建一个匿名用户。然后,每当您想使用通知发送邀请时,您都可以实例化“匿名”实例。我相信可以将目标邮件配置为您的目标目标电子邮件地址。抱歉,我还没有尝试过,因为没有附加代码。如果您还需要我测试,请告诉我。
          【解决方案5】:

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

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

          【讨论】:

          • 谢谢@martin。从逻辑上讲,这确实是有道理的。我尝试使用通知的唯一原因是因为可以轻松地为文本和 html 使用标准电子邮件模板并为此添加数据库条目。但是,是的,我确实理解可邮寄的课程可能更合适,因为这实际上不是用户通知。
          • 您可以将邀请模型设置为可通知
          • @chrisbjr 但是……有意义吗?你通知邀请吗?还是收件人或受邀者?
          • 您可以将任何模型设为可通知 - 我认为您不应仅限于“通知”用户。虽然,在这种情况下,如果您确实有一个“邀请”模型,那么值得重新考虑该模型肯定会附有某种“用户”。在这种情况下,你可以做$invitation->user->notify(new WhateverNotification)
          • @chrisbjr 是的。这就是为什么我说您很可能会通知邀请的收件人,而不仅仅是“通知”邀请本身。这没有任何意义。
          【解决方案6】:

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

          您需要在Invite 模型上使用use 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 并在通知模板中使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-19
            • 2018-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多