web-dev-qa-db-ja.com

Laravel 5.3アカウントを持たないユーザーに通知を送信する

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. これらの場合、Notificationの代わりにLaravelのMailableクラスを使用するのが私の唯一の選択ですか?

10
Neel

あなたの投稿が同じものを探しているのを見つけましたが、自分で答えました。

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を通過して、通知テンプレート内で使用できます。

10
Andreas Elia

いくつかの代替ソリューションは、ユーザーモデルを新しくして、保存せずに電子メール属性を設定することです。これで、インスタンスに通知できます。

私はこれをこの特定のケースに対する正しいアプローチとは考えていませんが、書かれた質問に対して、そしてこのスレッドは存在しないユーザーに通知するためのいくつかの異なる方法を提供するので、ここに書くと思いました。

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

このソリューションは、通知をキューに入れるときに問題を引き起こす可能性があることに注意してください(特定のユーザーIDを参照していないため)。

Laravel> = 5.5では、この正確なケースをカバーする「オンデマンド通知」を行うことができます、存在しないユーザーに通知する場合。

ドキュメントからの例:

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

これにより、通知が電子メールアドレスに送信され、そのアプローチをキューに入れることができます。

ドキュメント: https://laravel.com/docs/5.5/notifications#on-demand-notifications

7
thephper

通知は、通知可能オブジェクトに送信されることを意図しています。招待状を「通知」することはありません。

アプリケーションの使用を招待されたことを誰かにメールで送信するだけの場合は、そのメールアドレスにメールを送信するだけです。この場合、通知は適切ではありません。

3
Martin Bean

これを簡単に行う方法を見つけました。まず、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');

次に、メッセージ送信を処理するように通知クラスを構成します。私はコンストラクターでこのようなことをしました。

_protected $data;

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

これが誰かに役立つことを願っています。

1
Pendragon