Laravel France

comment gerer l'autehntification de plusieur types d'utilisateurs avec laravel 8

Avatar de PRINCETAKOcromwell
PRINCETAKOcromwell

bonjour, j'aimerai creer une application web avec laravel ou on a la les classes Driver et Passenger qui herittent de la classe User.Mais je ne sais pas comment gerer l'authentification.j'aimerai faire un formulaire pour enregistrer un Passenger et un autre pour enregistrer un Driver car ils auront des attributs différents.

pouvez vous m'aider avec le code ou bien m'expliquer comment je pourait gerer cela .

Merci.

Posté il y a 1 mois
Avatar de khalyomede
khalyomede

Bonsoir,

Pour l'authentification, avec Laravel tu n'utilise pas d'héritage au sens UML. Si tu souhaites authentifier un Driver ou un Passenger, ils devront tous deux référencer un User, puisque Laravel exploite l'authentification (et tout autre mécanisme de sécurité comme les Policies etc...) seulement en se basant sur le modèle User.

En se connectant avec son email (j'imagine ?), si ton modèle User à une référence vers un Driver, tu pourras afficher un dashboard après sa connexion qui sera en rapport avec les spécificités d'un Driver. De même pour un User attaché à un Passenger.

Si on imagine que tu as une page de formulaire, qui te permet de remplir :

  • Nom
  • Prénom
  • Email

Et un champs de séléction, qui quand séléctionné sur la valeur "conducteur" affichera des champs spécifiques pour enregistrer un Driver :

  • Numéro de permis de conduire
  • ...

Et si séléctionné sur "passager" affichera des champs spécifiques pour enregistrer un Passenger :

  • Âge
  • ...

De cette façon quand tu recevra les données du formulaire dans ton controller, tu créera systématiquement un User, et grâce au champs de séléction tu pourra créer et associer un Driver ou Passenger. Je te montre en code ce que ça pourrait donner, ce n'est pas le code définitif car je n'ai ni tes migrations, ni tes champs spécifiques à chaque modèles donc ça sera à toi de l'adapter.

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class RegistrationController
{
  public function store(Request $request)
  {
    // Validate la requête ici
    // Ou utilise une FormRequest (conseillé)
    
    DB::beginTransaction();
    
    $user = User::create([
      "email" => $request->email,
      "name" => $request->name,
      "password" => Hash::make($request->password), // FORTEMMENT DECONSEILLE, voir message ci-dessous
    ]);
    
    if ($request->type === "driver") {
      $user->driver()->create([
        "driver_license_number" => $request->driver_license_number,
      ]);
    } else if ($request->type === "passenger") {
      $user->passenger()->create([
        "age" => $request->age,
      ]);
    }

    // Si $user->passenger instanceof Passenger, c'est un passager
    // Si $user->driver instanceof Driver, c'est un conducteur
    
    DB::commit();
  
    return redirect()->route("dashboard");
  }
]

Bien que ça permette de mieux comprendre l'idée derrière, je déconseille FORTEMMENT d'enregistrer tes utilisateurs de cette façon qui est très manuelle et sujette à erreur. L'idéale c'est d'utiliser laravel/breeze, qui va te générer tous les controlleurs nécessaires, et tu n'auras qu'à venir rajouter ta logique métier au sein du controlleur existant.

Bien entendu le controlleur ci-dessus assume un certain nombre de choses que je n'ai pas écrite :

  • Des migrations avec les bonnes clés étrangères
  • Des modèles avec les méthode des relations bien configurées
  • Un formulaire avec les champs attendus

En espérant que ça puisse te donne des pistes...

Vous ne pouvez pas répondre à ce sujet.