J'ai un champ booléen receiveEmail
dans le modèle utilisateur d'une application Laravel. Comment puis-je m'assurer que les notifications par e-mail respectent ce champ et n'envoie l'e-mail à l'utilisateur que si le champ est vrai?
Ce que je veux, c'est que ce code:
$event = new SomeEvent($somedata); Auth::user()->notify($event);
où SomeEvent est une classe qui étend la notification et implémente 'mail' sur la méthode via ()
, n'envoie un e-mail que si l'utilisateur a autorisé les e-mails.
3 Réponses :
essayez de créer une nouvelle méthode dans le modèle utilisateur comme celui-ci ..
fichier de modèle utilisateur ..
App\User::where('id',1)->first()->notifyMail();
et appelez maintenant comme ceci dans le contrôleur .. p >
App\User::find(1)->notifyMail();
ou
Auth::user()->notifyMail();
ou
public function scopeNotifyMail() { if($this->receiveEmail == true) { //if field is enable email other wise not send.. $event = new SomeEvent($somedata); $this->notify($event); } }
J'ai plusieurs événements, pas un seul. Cela ajouterait une tonne de méthodes au modèle utilisateur, et ne gérerait pas les collections d'utilisateurs dans quelque chose comme Notification :: send ($ users, $ event)
;
J'ai fini par créer un nouveau canal qui implémente la vérification. Dans l'application / les chaînes, ajoutez votre chaîne, quelque chose comme ceci:
/** * Register any application services. * * @return void */ public function register() $this->app->bind( \Illuminate\Notifications\Channels\MailChannel::class, UserCheckMailChannel::class ); }
Ensuite, liez votre classe sur Providers / AppServiceProvider.php
à l'ancienne classe de messagerie: p >
namespace App\Channels; use App\User; use Illuminate\Notifications\Channels\MailChannel; use Illuminate\Notifications\Notification; use Illuminate\Support\Arr; class UserCheckMailChannel extends MailChannel { /** * Send the given notification. * * @param mixed $notifiable * @param \Illuminate\Notifications\Notification $notification * @return void */ public function send($notifiable, Notification $notification) { // check if user should receive emails. Do whatever check you need here. if ($notifiable instanceof User && !$notifiable->receiveEmails) { return; } // yes, convert to mail and send it $message = $notification->toMail($notifiable); if (!$message) { return; } parent::send($notifiable, $notification); } }
Faites vérifier ceci via la méthode (): https://laravel.com/docs/6.x/notifications#specifying -delivery-channels
public function via($notifiable) { // $notifiable object is User instance for most cases $wantsEmail = $notifiable->settings['wants_email']; // your own logic if(!$wantsEmail){ // no email only database log return ['database']; } return ['database', 'mail']; }
J'espère que cela fonctionnera lors de l'envoi de notifications à plusieurs utilisateurs. Merci
Dépend de votre logique de messagerie. Envoyez-vous un e-mail directement à un e-mail ou demandez-vous d'abord un utilisateur correspondant à cet e-mail? Vous devez fournir du code ici; nous ne pourrons pas beaucoup vous aider.