Laravel 5.3 Send Notification to Users without an account

Neel picture Neel · Nov 24, 2016 · Viewed 9.7k times · Source

With the Laravel 5.3 Notification feature, I see that the notifications are sent to users like this:

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

Where I believe $user is the notifiable entity. What if I want to send notifications to users who doesn't have an account yet? In my app, users send invitation to their friends to join. I am trying to use Laravel's Notification to send the invite code to users who don't have an account yet.

When users invite someone, their data is stored in Invite Model like this:

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

I thought I can use notify to send notifications to the Invite model like this:

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

But the above doesnt work. I get the error:

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

So my question is:

  1. Am I able to send Notification only to User Model?

  2. Is there a way to send Notifications to new users who doesnt have an account yet?

  3. Is my only choice is to use Laravel's Mailable class instead of Notification in these cases?

Answer

thephper picture thephper · Feb 19, 2019

Some alternative solution could be to just new up a user model and set the email attribute without saving it. The instance can now be notified.

I don't see this as the correct approach for this particular case, but for the questions written and since this thread provides some different ways to notify a non-existing user I thought I would write it here.

$invitedUser = new User;
$invitedUser->email = '[email protected]';
$invitedUser->notify(new InvitationNotification());

Beware, that this solution may cause problems when queueing notification (because it doesn't reference a specific user id).

In Laravel >=5.5 it is possible to make an "on-demand notification", which covers this exact case, where you want to notify a non-existing user.

Example from the docs:

Notification::route('mail', '[email protected]')
        ->route('nexmo', '5555555555')
        ->notify(new InvoicePaid($invoice));

This will send the notification to the email address, and that approach can be queued etc.

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