Laravel 5

Reset de mail sur le Profil

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    Bonjour à tous,

    Je voudrais savoir si mon code, qui fonctionne, peut être optimisé. Pour remettre dans le contexte, j'aimerais donner la possibilité aux utilistateurs de mon site de pouvoir changer d'adresse mail. Pour cela j'ai créer une table mail_reset avec comme champs le user_id, la nouvelle adresse mail et une clé. Lorsque l'utilisateur renseigne une nouvelle adresse mail, un mail lui est envoyé sur la nouvelle adresse mail. Après avoir cliqué sur le lien contenu dans le mail, l'utilisateur est redirigé soit sur son profil soit sur la page d'acceuil s'il n'est pas connecté.

    voici la première partie de mon code:


    public function resetMail(ResetMailRequest $request, SendInBlue $mail) {
    $key = str_random(30);
    $result = $mail->sendMailReset($request->input('mail'), $key);

    if($result['code'] > 201) return redirect('user')->with('error', 'Problème lors de l\'envoi du mail.');

    $this->userR->addOrUpdateMailReset($request->input('mail'), $key);

    return redirect('user')->with('ok', 'Un mail vous a été envoyé pour confirmer votre changement.');
    }

    la partie qui pourrait être optimisé je pense et la fonction addOrUpdateMailReset.
    Le but de cette fonction est de vérifié si l'utilisateur n'a pas déjà fait une demande de changement de mail et si c'est la cas la mettre à jour, sinon en créer une nouvelle. Je n'ai pas de model pour cette table. J'utilise donc le Query Builder:

    public function addOrUpdateMailReset($mail, $key) {
    $existe = DB::table('mails_reset')->where('user_id', Auth::user()->id)->exists();

    if($existe) return $this->updateMailReset($mail, $key);

    return $this->addMailReset($mail, $key)
    }
    public function addMailReset($mail, $key) {
    DB::table('mails_reset')->insert(['user_id' => Auth::user()->id, 'mail' => $mail, 'key' => $key]);
    }
    public function updateMailReset($mail, $key) {
    DB::table('mails_reset')
    ->where('user_id', Auth::user()->id )
    ->update(['user_id' => Auth::user()->id, 'mail' => $mail, 'key' => $key]);
    }

    J'ai chercher pour utiliser une fonction comme le findOrCreated'eloquent mais je n'ai pas trouvé, c'est pour cela que j'ai créer trois fonction pour réaliser cela.

    Alors qu'en pensez vous

    Merci d'avance

    Methos

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2512

    Bonjour,

    Avec le Query Builder on dispose de la fonction updateOrInsert.

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    Bonjour,

    Merci pour votre réponse :D

    Arghhhh j'ai passé 20 minutes à chercher en vain :'( et cela me paraissais bizarre d'ailleurs ! Je corrige cela :D Autre chose ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2512

    Juste une question, pourquoi pas un model ?

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    Je ne savais pas trop quoi mettre comme model, pour moi un model correspond à une"entité" (ex: user, vidéo, catégorie , posts ...), Mais la je suis plus sur des actions liées à l'utilisateur.

    Pour cela que j'ais mis mes fonctions dans le UserController et que j'utiliser le UserRepository

    Après je suis ouvert à toutes les suggestions, tu aurais fait comment toi ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2512

    J'aurais créé un modèle pour la table mails_reset pour créer une relation avec users et utiliser Eloquent.

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    oki je vais faire alors, oui c'est mieux car imaginons le cas extreme qu'un utilisateur soit supprimé alors qu'il a fait une demande de reset ... xD

    Bon je fais les modifs et je reposte mon code :D

    Merci en tous cas, je suis un peu perfectionniste et cela permet d'apprendre des trucs :D

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    Bonjour !

    Me revoilà, j'ai crée le model et la relation, puis j'ai utilisé la méthode updateOrCreate, voila mon code:

    public function resetMail(ResetMailRequest $request, SendInBlue $mail) {
    $key = str_random(30);
    $result = $mail->sendMailReset($request->input('mail'), $key);

    if($result['code'] > 201) return redirect('user')->with('error', 'Problème lors de l\'envoi du mail.');

    $this->userR->addOrUpdateMailReset($request->input('mail'), $key);

    return redirect('user')->with('ok', 'Un mail vous a été envoyé pour confirmer votre changement.');
    }
    public function addOrUpdateMailReset($mail, $key) {
    return MailReset::updateOrCreate(['mail' => $mail, 'key' => $key, 'user_id' => Auth::user()->id]);
    }

    Est ce que je peux encore l'optimiser ?
    Merci d'avance

    Methos

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    Je viens de me rendre compte que j'ai fais une erreur ... dernière fonction je dois mettre:

    return MailReset::updateOrCreate(['user_id' => Auth::user()->id], ['mail' => $mail, 'key' => $key]);

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    23

    petit up, est ce que mon code est correcte ?

Vous ne pouvez pas répondre à ce sujet.