Les deux verbes HTTP (aussi appelés méthodes HTTP) les plus utilisés sont GET et POST. Ce sont d'ailleurs les deux seules méthodes qui peuvent être utilisées dans un formulaire Web.
Pourtant, dans le merveilleux mode RESTful, il existe d'autres verbes HTTP. Laravel, ou plutôt Symfony, un des nombreux outils utilisés par Laraval, peut travailler avec les verbes PUT, PATCH et DELETE.
Si le rôle de DELETE est évident, les verbes PUT et PATCH nécessitent des précisions.
On utilisera PUT pour remplacer un enregistrement complet. Le verbe PATCH, quant à lui, permettra de remplacer un enregistrement de façon partielle ou même de modifier des informations qui n'ont pas été saisies.
C'est précisément le cas lorsqu'on modifie un enregistrement dans une application Web. On ne modifiera pas nécessairement tous les champs. De plus, le champ updated_at sera mis à jour par Laravel.
La route pour modifier un enregistrement utilisera donc le verbe PATCH.
Ex :
Route::patch('produits/{id}', [
'as' => 'produits.update',
'uses' => 'ProduitsController@update',
]);
L'attribut action du formulaire de modification devra renvoyer à cette route. Mais comme seuls les verbes GET et POST sont supportés dans les formulaires, il faudra ajouter un champ caché pour que Laravel puisse reconnaître le verbe PATCH.
Ex :
<form method="POST" action="{{ route('produits.update', [$produit->id]) }}">
@csrf
@method('PATCH')
...
</form>
Ceci générera le code HTML suivant :
<form method="POST" action="http://mondomaine.com/produits/14">
<input type="hidden" name="_token" value="Vo4hNMnP0Y13TvGnc0hQ5MO0xzuR7UGZTJJkL51U">
<input type="hidden" name="_method" value="PATCH">
...
</form>
La méthode update reçoit deux paramètres : l'objet $request, pour lequel on prendra soin d'ajuster le type afin que les données soient automatiquement validées, puis l'identifiant de l'enregistrement à mettre à jour.
Après avoir retrouvé les données de cet enregistrement dans la BD, la valeur de chacun des champs sera ajustée à l'aide de l'information saisie.
Les données seront ensuite enregistrées à l'aide de la méthode save().
Ex :
/**
* Enregistre les modifications pour un produit.
*
* @param \app\Http\Requests\ProduitRequest $request
* @param int $id
* @return \Illuminate\Http\RedirectResponse
*/
public function update(ProduitRequest $request, int $id) : RedirectResponse
{
$produit = Produit::findOrFail($id);
$produit->code = $request->code;
$produit->description = $request->description;
$produit->categorie_id = $request->categorie_id;
$produit->save();
...
}
Comme pour toute opération, un message flash informera l'usager de la réussite ou de l'échec de l'opération puis le traitement sera redirigé vers une page de votre choix, par exemple la liste des produits.
Ici encore, il est possible pour la route d'injecter automatiquement le modèle dans la méthode d'action du contrôleur.
Il n'y a rien à modifier au formulaire : il doit bel et bien passer l'identifiant de l'enregistrement en paramètre à la route.
C'est au niveau de la route et du contrôleur que le nom et le type du paramètre seront modifiés pour correspondre au modèle.
Ex :
Route::patch('produits/{produit}', [
'as' => 'produits.update',
'uses' => 'ProduitsController@update',
]);
public function update(ProduitRequest $request, Produit $produit) : RedirectResponse
{
$produit->code = $request->code;
$produit->description = $request->description;
$produit->categorie_id = $request->categorie_id;
$produit->save();
...
}
« PUT Versus POST ». Knp University. https://knpuniversity.com/screencast/rest/put-versus-post
« PATCH: The Other Edit ». Knp University. https://knpuniversity.com/screencast/rest/patch
« Routing - Form Method Spoofing ». Laravel. https://laravel.com/docs/master/routing#form-method-spoofing
▼Publicité