Laravel 5

Reset de mail sur le Profil

Avatar de Methos
Methos

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

Posté il y a 1 an
Avatar de bestmomo
bestmomo

Bonjour,

Avec le Query Builder on dispose de la fonction updateOrInsert.

Posté il y a 1 an
Avatar de Methos
Methos

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 ?

Posté il y a 1 an
Avatar de bestmomo
bestmomo

Juste une question, pourquoi pas un model ?

Posté il y a 1 an
Avatar de Methos
Methos

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 ?

Posté il y a 1 an
Avatar de bestmomo
bestmomo

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

Posté il y a 1 an
Avatar de Methos
Methos

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

Posté il y a 1 an
Avatar de Methos
Methos

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

Posté il y a 1 an
Avatar de Methos
Methos

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

Posté il y a 1 an
Avatar de Methos
Methos

petit up, est ce que mon code est correcte ?

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.