Laravel 5.3在没有帐户的情况下向用户发送通知

时间:2016-11-24 07:16:31

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

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

add_filter( 'woocommerce_add_cart_item_data', 'allow_only_one_product' );

function allow_only_one_product( $cart_item_data ) {

    global $woocommerce;
    $woocommerce->cart->empty_cart();

    // Do nothing with the data and return
    return $cart_item_data;
}

我认为$user->notify(new InvoicePaid($invoice)); 是可通知的实体。如果我想向没有帐户的用户发送通知怎么办?在我的应用中,用户向他们的朋友发送邀请以加入。我正在尝试使用Laravel的通知将邀请代码发送给尚未拥有帐户的用户。

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

$user

我以为我可以使用notify向Invite模型发送通知,如下所示:

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

但上述方法无效。我收到错误:

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

所以我的问题是:

  1. 我是否只能将通知发送给用户模型?

  2. 有没有办法将通知发送给没有的新用户 一个帐户呢?

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

6 个答案:

答案 0 :(得分:9)

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

您需要use Notifiable;模型上的Invite

然后导入use Illuminate\Notifications\Notifiable;并且应该可以在->notify模型上使用Invite

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

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

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

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

答案 1 :(得分:2)

通知意味着发送到须通知的对象。您没有“通知”邀请。

如果你想要做的就是给某人发电子邮件,他们已经被邀请使用某个应用程序,那么只需发送一封电子邮件到该电子邮件地址即可。在这种情况下,通知不合适。

答案 2 :(得分:2)

一些替代解决方案可能是仅建立用户模型并设置email属性而不保存它。 现在可以通知该实例。

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

$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)

我只是想出了一个更简单的方法。首先,您必须覆盖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', 'Thanks for registering! Check your inbox for the activation link');
  4. 接下来,配置Notification类以处理邮件发送。我在构造函数中做了类似的事情;

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

    我希望这有助于某人。

答案 4 :(得分:0)

我遇到了类似的问题,并且可以使用\Illuminate\Notifications\AnonymousNotifiable的实例来解决它。该对象被序列化,不需要任何数据库基础结构,并且可以与队列一起使用。

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

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

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

答案 5 :(得分: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