Formation PUB030 : Laravel, 2019 Le formulaire d'ajout

28.9 Traitement des champs en lot (mass assignment) : $fillable et $guarded


Laravel offre un mécanisme pour faciliter l'enregistrement d'informations dans la base de données à partir d'un tableau associatif, par exemple $request->all(). On dira qu'on effectue un traitement des champs en lot. En anglais, on utilisera le terme mass assignment.

Le traitement des champs en lot peut être effectué notamment à l'aide des méthodes create(), fill() et update() ainsi que lors de l'instanciation d'un modèle avec new.

Ex :

Contrôleur Laravel (PHP)

public function store(Request $request) : RedirectResponse
{
   // $request->all() est un tableau associatif de toutes les valeurs saisies dans le formulaire
    $produit = new Produit($request->all());
    ...
    $produit->save();
    ...
}

Autre exemple :

Contrôleur Laravel (PHP)

public function update(Request $request) : RedirectResponse
{
    $produit->update(['gratuit'=>$request->gratuit]);
    ...
}

Si on ne prend pas quelques précautions, un tel traitement pourrait ouvrir la porte à des vulnérabilités. Par exemple, si on a un champ dans la table des usagers qui donne le statut d'administrateur, un usager malveillant pourrait trafiquer le formulaire de modification d'usager pour lui ajouter un champ qui porte le nom attendu par votre modèle... et lui donner la valeur true. Le traitement des champs en lot récupérerait l'ensemble des champs du formulaire et les passerait à la méthode de traitement en lot. Notre usager serait alors promu administrateur. Ouch !

Heureusement, si vous tentez un traitement des champs en lot sur un modèle dans lequel vous n'avez pas effectué les configurations nécessaires, vous obtiendrez une erreur du genre « MassAssignmentException in Model.php _token ».

MassAssignmentException in Model.php

Pour utiliser le traitement des champs en lot sur un modèle, vous devez ajouter une propriété $fillable ou une propriété $guarded à ce modèle.

Liste blanche

La première option consiste à définir dans le modèle la liste des champs dont la valeur peut être modifiée par une telle opération.

Dans les faits, l'instruction $produit = new Produit($request->all()); indique à Laravel qu'il doit automatiquement faire le lien entre l'attribut name des balises HTML de saisie (présentes dans la variable $request) et les champs listés dans $fillable.

Si on tente de modifier la valeur d'un champ qui n'est pas listé, le champ conservera simplement sa valeur actuelle.

Ex :

Modèle Laravel (PHP)

/**
 * Liste de champs pouvant être assignés en lot (mass assignment).
 *
 * @var array
 */
protected $fillable = [
    'nomfamille',
    'prenom',
    'telephone',
    'courriel',
    'bureau',
];

Si vous ajoutez un champ à une table, n'oubliez pas de l'ajouter dans la liste blanche sans quoi le champ sera ignoré lorsque vous tenterez d'y enregistrer des données.

Liste noire

Plutôt que de faire une liste blanche des champs pouvant être traités en lot, il est possible de tenir une liste noire des champs protégés.

À ce moment, l'instruction $produit = new Produit($request->all()); indique à Laravel qu'il doit automatiquement faire le lien entre l'attribut name des balises HTML de saisie (présentes dans la variable $request) et les champs qui ne sont pas listés dans $guarded.

Ex :

Modèle Laravel (PHP)

/**
 * Liste de champs ne pouvant pas être assignés en lot (mass assignment).
 * Devront être assignés explicitement à l'aide d'une instruction du genre 
 * $objet->champ = $valeur;
 * $objet->save();
 *
 * @var array
 */
protected $guarded = [
    'administrateur',
];

Le modèle doit avoir une propriété $fillable ou une propriété $guarded mais pas les deux.

Pour plus d'information

«  Eloquent: Getting Started - Mass Assignment ». Laravel. https://laravel.com/docs/master/eloquent#mass-assignment

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre