Que signifie" affectation de masse " dans Laravel?

Quand je suis passé par Laravel Document sur Eloquent ORM topic part, j'ai eu un nouveau terme Mass Assignment.

Le Document

Montre comment effectuer L'affectation de masse et les paramètres de propriétés fillable ou guarded. Mais après avoir traversé cela, je n'avais pas clairement compris à propos de Mass Assignment et comment cela fonctionne.

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

Quelqu'un a une explication simple à ce sujet?

94
demandé sur dayuloli 2014-03-09 11:14:28

4 réponses

L'affectation de masse est 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(Input::all());

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

Vous pouvez utiliser fillable pour protéger les champs que vous souhaitez autoriser pour la mise à jour.

Disons que dans votre table utilisateur vous avez un champ qui est user_type et qui peut avoir des valeurs de user / 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 pour user_type et envoyer 'admin' avec les autres données du formulaire, et passer facilement leur compte à un compte admin... les mauvaises nouvelles.

En ajoutant:

$fillable = array('name', 'password', 'email');

Vous vous assurez que seules ces valeurs peuvent être mises à jour en utilisant mass assignment

Pour pouvoir mettre à jour la valeur user_type, vous devez la définir explicitement sur le modèle et enregistrer il, comme ceci:

$user->user_type = 'admin';
$user->save();
136
répondu duellsy 2014-03-09 09:12:23

L'affectation de masse est un processus d'envoi d'un tableau de données qui seront enregistrées sur le modèle spécifié à la fois. En général, vous n'avez pas besoin d'enregistrer les données sur votre modèle une par une, mais plutôt dans 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 passe 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.

Disons que vous avez une table' étudiants', avec des champs "student_type, first_name, last_name". Vous pouvez assigner en masse "first_name, last_name" mais vous voulez protéger student_type d'être directement modifié. C'est là que comment et gardé 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 $fillable au 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
} 

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

Guarded est l'inverse de fillable. Si fillable spécifie les champs à affecter en masse, guarded spécifie quels champs ne sont pas assignables 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 de masse

5
répondu Udhav Sarvaiya 2018-04-05 10:12:54

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

Techniquement juste du haut de ma tête. Fillable signifie quelles colonnes de la table sont autorisées à être insérées, guarded signifie que le modèle ne peut pas insérer dans cette colonne particulière.

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

Ceci est pour la sécurité, et la protection sur votre table lorsque vous utilisez le modèle. L'affectation de masse semble être juste un avis ou un avertissement que vous n'avez pas dit au modèle qui est remplissable et gardé et le rend vulnérable à une sorte d'attaques.

4
répondu majidarif 2014-03-09 07:32:47

Mise à JOUR

Pour Laravel 5.x vous pouvez vous référer à la dernière doc de masse

Ou

Une explication bien détaillée sur le moment d'utiliser remplissable ou gardé

2
répondu Ikong 2015-11-24 12:16:11