web-dev-qa-db-fra.com

Que signifie "Affectation de masse" à Laravel?

Quand j'ai parcouru Laravel Document sur la partie sujet Eloquent ORM, j'ai reçu un nouveau terme Mass Assignment.

Présentation du document Comment effectuer une assignation en masse et les paramètres de propriétés fillable ou guarded. Mais après avoir traversé cela, je ne comprenais pas bien Mass Assignment Et son fonctionnement.

Dans mon expérience passée dans CodeIgniter, je n’avais pas non plus entendu parler de ce terme.

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

128
Chen-Tsu Lin

L'affectation en masse se produit lorsque vous envoyez un tableau à la création du modèle, en définissant essentiellement un ensemble de champs sur le modèle en une seule fois, plutôt que l'un après l'autre, comme suit:

$user = new User(Input::all());

(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 réellement autoriser pour la mise à jour.

Disons que dans votre table utilisateur, vous avez un champ qui est user_type et qui peuvent avoir les valeurs utilisateur/admin

Évidemment, vous ne voulez pas que les utilisateurs puissent mettre à jour cette valeur. En théorie, si vous utilisiez le code ci-dessus, quelqu'un pourrait injecter dans un formulaire un nouveau champ pour user_type et envoyez 'admin' avec les autres données du formulaire, et basculez facilement leur compte sur un compte administrateur ... mauvaise nouvelle.

En ajoutant:

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

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

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

$user->user_type = 'admin';
$user->save();
177
duellsy

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

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

Supposons que vous ayez une "table d'étudiants", avec des champs "type_étudiant, prénom, nom, dernier". Vous voudrez peut-être attribuez en masse "prénom_nom, dernier_nom" mais vous voulez protéger type_étudiant contre toute modification directe. C'est là que peut être rempli et gardé a lieu.

Remplissable vous permet de spécifier les champs 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
} 

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 quels champs doivent être affectés 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 devriez utiliser soit $ remplissable, soit $ gardé - pas les deux.

Pour plus de détails, ouvrez le lien: - Mass Assignment

19
Udhav Sarvaiya

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

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

Notez que lorsque vous essayez d'effectuer une assignation en masse avec like, insérez-la 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 réellement insérée 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 en masse semble être simplement un avis ou un avertissement indiquant que vous n'avez pas indiqué au modèle quels modèles sont remplissables et protégés, ce qui le rend vulnérable à une sorte d'attaque.

5
majidarif

[~ # ~] met à jour [~ # ~]

Pour Laravel 5.x , vous pouvez vous reporter au dernier document affectation de masse

OR

Une explication bien détaillée sur le moment d'utilisation remplissable ou protégée

3
Ikong

C'est à ce moment qu'un tableau de données reçues est sauvegardé en une 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 soient renseignées sur le modèle.

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

Par exemple

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

Lorsque laravel détecte que vous affectez des données en masse, cela 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 non désirées sous une forme html à votre base de données.

1
Punit khandelwal