validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:clients,email'], 'phone' => ['nullable', 'string', 'max:20'], 'city' => ['nullable', 'string', 'max:100'], ]); $client = Client::create($validated); // 201 = Created : la ressource vient d'être créée. return (new ClientResource($client)) ->response() ->setStatusCode(201); } /** * TP9/TP10 - Grâce au route model binding, Laravel recherche * automatiquement le Client correspondant à {client}. * Si l'identifiant n'existe pas, Laravel renvoie une erreur 404. */ public function show(Client $client) { return new ClientResource($client); } /** * TP10 - PATCH permet de modifier seulement les champs envoyés. * "sometimes" évite d'obliger l'utilisateur à renvoyer tout le client. */ public function update(Request $request, Client $client) { $validated = $request->validate([ 'name' => ['sometimes', 'required', 'string', 'max:255'], 'email' => [ 'sometimes', 'required', 'email', 'max:255', Rule::unique('clients', 'email')->ignore($client->id), ], 'phone' => ['sometimes', 'nullable', 'string', 'max:20'], 'city' => ['sometimes', 'nullable', 'string', 'max:100'], ]); $client->update($validated); return new ClientResource($client); } /** * TP10 - Je supprime le client avec Eloquent. * Une suppression réussie renvoie 204 No Content. */ public function destroy(Client $client) { $client->delete(); return response()->noContent(); } /** * TP9 - Défi autonome : rechercher un client grâce à son email. */ public function search(Request $request) { $validated = $request->validate([ 'email' => ['required', 'email'], ]); $client = Client::where('email', $validated['email'])->first(); if (! $client) { return response()->json([ 'message' => 'Aucun client ne correspond à cette adresse email.', ], 404); } return new ClientResource($client); } }