4
votes

Vérifiez les paramètres utilisateur avant d'envoyer une notification par e-mail dans Laravel

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.


1 commentaires

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.


3 Réponses :


0
votes

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);
        }    
}


1 commentaires

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



1
votes

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);
    }
}


0 commentaires

5
votes

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


0 commentaires