Laravel 9 Rest Api + Auth

Construire application api avec authentification par Sanctum

Authentification

Créer un controller pour les apis authentifications

php artisan make:controller Api\\AuthController

Puis on fait les routes dans api

Route::post('auth/register', [AuthController::class, 'createUser']);
Route::post('auth/login', [AuthController::class, 'loginUser']);

Dans le controller AuthController je crée les functions

public function createUser(Request $request)
    {
        try {
            //code...
            $validateUser = Validator::make($request->all(), [
                'name' => 'required',
                'email' => 'required|email|unique:users,email',
                'password' => 'required',
            ]);
    
            if ($validateUser->fails()) {
                return response()->json([
                    'status' => false,
                    'message' => 'Erreur de Validation ',
                    'errors' => $validateUser->errors()
                ], 401);
            }

            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make( $request->password),
            ]);

            return response()->json([
                'status' => true,
                'message' => 'User créé ',
                'token' => $user->createToken("secret")->plainTextToken,
            ], 200);

        } catch (\Throwable $th) {
            //throw $th;
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }

    }


    public function loginUser(Request $request)
    {
        try {
            $validateUser = Validator::make($request->all(), [
                'email' => 'required|email',
                'password' => 'required',
            ]);
    
            if ($validateUser->fails()) {
                return response()->json([
                    'status' => false,
                    'message' => 'Erreur de Validation ',
                    'errors' => $validateUser->errors()
                ], 401);
            }
            if (!Auth::attempt($request->only(['email', 'password']))) {
                return response()->json([
                    'status' => false,
                    'message' => 'Email & Password non correct ',
                ], 401);
            }
            $user = User::where('email', $request->email)->first();

            return response()->json([
                'status' => true,
                'message' => 'login OK ',
                'token' => $user->createToken("secret")->plainTextToken,
            ], 200);

        } catch (\Throwable $th) {
            //throw $th;
            return response()->json([
                'status' => false,
                'message' => $th->getMessage()
            ], 500);
        }
    }

Pour le client il faut alors créer une fonction login qui appelle l’ api (loginUser) et une fonction register qui appelle l’api (CreateUser) de l’application api pour récupérer ainsi le $token.

Données

Après avoir créé un model avec sa migration

php artisan make:model Patient-m

ou avoir importé une table et fait le model. On fait un request pour validation de Store et Update

php artisan make:request PatientStoreRequest

Ensuite on fait une resource pour indiquer ce que on veut montrer

php artisan make:resource Api/V1/PatientResource

Ensuite on fait le controller

php artisan make:controller Api/V1/PatientController --model=Patient

Dans le controller

public function index()
{
$patients = Patient::all();
return PatientResource::collection($patients);
}

public function store(PatientStoreRequest $request)
{
$patients = Patient::create($request->all());
return new PatientResource($patients);
}

public function update(PatientStoreRequest $request, Patient $patient)
{
$patient->update($request->all());
return new PatientResource($patient);
}

public function destroy(Patient $patient)
{
$patient->delete();
return response(null, 204);
}

Et dans les routes api

Route::group(['prefix' => 'v1']), function (){
Route::apiResource('Patients', PatientController::class);
}