Que signifie «affectation en masse» à Laravel?

159

Quand j'ai parcouru Laravel Document sur la partie thématique Eloquent ORM, j'ai trouvé un nouveau terme Mass Assignment.

Le document montre comment effectuer une attribution en masse et les paramètres de propriétés fillableou guarded. Mais après avoir traversé cela, je n'avais pas clairement compris Mass Assignmentet comment cela fonctionne.

Dans mon expérience passée avec CodeIgniter, je n'ai pas non plus entendu parler de ce terme.

Quelqu'un at-il une explication simple à ce sujet?

Chen-Tsu Lin
la source

Réponses:

206

L'affectation en masse se produit lorsque vous envoyez un tableau à la création du modèle, en définissant essentiellement un tas de champs sur le modèle en une seule fois, plutôt qu'un par un, quelque chose comme:

$user = new User(request()->all());

(Au lieu de définir explicitement chaque valeur sur le modèle séparément.)

Vous pouvez utiliser fillablepour protéger les champs que vous souhaitez que cela autorise réellement à la mise à jour.

Vous pouvez également empêcher tous les champs d'être assignables en masse en procédant comme suit:

protected $guarded = ['*'];

Disons que dans votre table utilisateur, vous avez un champ qui est user_typeet qui peut avoir des valeurs utilisateur / admin

Évidemment, vous ne voulez pas que les utilisateurs puissent mettre à jour cette valeur. En théorie, si vous utilisez le code ci-dessus, quelqu'un pourrait injecter dans un formulaire un nouveau champ user_typeet envoyer `` admin '' avec les autres données du formulaire, et changer facilement son compte en compte administrateur ... mauvaise nouvelle.

En ajoutant:

$fillable = ['name', 'password', 'email'];

Vous vous assurez que seules ces valeurs peuvent être mises à jour à l'aide de mass assignment

Pour pouvoir mettre à jour la user_typevaleur, vous devez la définir explicitement sur le modèle et l'enregistrer, comme ceci:

$user->user_type = 'admin';
$user->save();
duellsy
la source
16
Merci pour cette réponse, je ne comprends tout à fait pas qui ferait une telle chose $user = new User(Input::all());(en tant que programmeur), il est si incontrôlé (ou dans quel scénario serait-ce utile).
Kyslik
14
... ce n'est pas du tout le but de la réponse, c'est de garder la réponse courte sans la détourner comme une leçon entière sur la sécurité, etc.
duellsy
3
J'ai compris, et je suis heureux d'avoir trouvé cette réponse. Je suis juste curieux de savoir dans quel scénario la ligne citée ci-dessus (dans mon commentaire) est utile. Je veux dire sans validation et tout ça.
Kyslik le
4
alors vous pensez en réponse à une question intitulée «Que signifie« Assignation de masse »dans Laravel?» J'aurais dû entrer dans les détails sur la validation ... c'était une réponse simple à la question sans dévier. Laissons cela tel quel.
duellsy
8
Peu importe le but de la question OP que j'ai posée, je n'ai donc pas à créer de nouveau fil, et vous continuez à parler de "pourquoi pas", parlez-en. Je ne comprends tout simplement pas pourquoi quelqu'un utiliserait la ligne telle que vous l'avez écrite au lieu de$user = new User; $user->name = 'Neo';
Kyslik
26

L'affectation en masse est un processus d'envoi d'un tableau de données qui seront enregistrées simultanément dans le modèle spécifié. En général, vous n'avez pas besoin d'enregistrer les données de votre modèle une par une, mais plutôt en un seul processus.

L'affectation de masse est bonne, mais il y a certains problèmes de sécurité derrière elle. Que faire si quelqu'un transmet une valeur au modèle et sans protection, il peut définitivement modifier tous les champs, y compris l'ID. Ce n'est pas bon.

Supposons que vous ayez une table "étudiants", avec les champs "student_type, first_name, last_name" . Vous voudrez peut-être attribuer en masse "first_name, last_name", mais vous voulez éviter que le student_type soit directement modifié. C'est là que les champs remplissables et gardés ont lieu.

Fillable vous permet de spécifier quels champs sont assignables en masse dans votre modèle, vous pouvez le faire en ajoutant la variable spéciale $fillableau modèle. Donc dans le modèle:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

les ' student_type ' ne sont pas inclus, ce qui signifie qu'ils sont exemptés.

Guarded est l'inverse de fillable. Si remplissable spécifie les champs à attribuer en masse, guarded spécifie quels champs ne peuvent pas être affectés en masse. Donc dans le modèle:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

vous devez utiliser $ fillable ou $ guarded - pas les deux.

Pour plus de détails, ouvrez le lien: - Affectation en masse

Udhav Sarvaiya
la source
1
Ceci est tout droit sorti du livre de Matt Stauffer "Laravel Up & Running"
fouet
5

L'affectation en masse signifie que vous remplissez une ligne avec plusieurs colonnes à l'aide d'un tableau de données. (un peu un raccourci au lieu de construire manuellement le tableau) en utilisant Input::all().

Techniquement juste du haut de ma tête. Remplissable signifie quelles colonnes du tableau peuvent être insérées, gardé signifie que le modèle ne peut pas s'insérer dans cette colonne particulière.

Notez que lorsque vous essayez de faire une affectation en masse avec like, insérez dans une colonne nommée "secret", et que vous avez spécifié qu'elle est gardée, vous pouvez essayer de l'insérer via le modèle, mais elle ne sera jamais vraiment insérée dans la base de données.

C'est pour la sécurité et la protection de votre table lors de l'utilisation du modèle. L'affectation de masse semble être juste un avis ou un avertissement indiquant que vous n'avez pas indiqué au modèle ce qui peut être rempli et protégé et le rend vulnérable à certaines attaques.

majidarif
la source
2

C'est à ce moment qu'un tableau de données reçues est enregistré à la fois dans un modèle.

En raison des problèmes de sécurité liés à cette méthode dans laravel, il est recommandé de définir les champs que vous souhaitez que les données demandées remplissent sur le modèle.

Vous pouvez utiliser la $fillablevariable pour définir les champs que vous souhaitez renseigner sur la table de base de données.

Par exemple

Protected $fillable = [‘username’, dob’, email’,];

Lorsque laravel détecte que vous attribuez des données en masse, il vous oblige à définir les champs que vous souhaitez affecter en masse dans la classe de modèle.

Quelqu'un peut facilement transmettre des données indésirables sous une forme html à votre base de données.

Punit khandelwal
la source