Dans laravel, la méthode fill est une méthode d'attribution d'attributs aux instances Eloquent. Cette méthode peut être comprise comme étant utilisée pour filtrer les champs redondants transmis depuis le front-end qui correspondent au modèle lorsque cette méthode est appelée, le courant ; Le modèle sera détecté dans le premier état, le modèle sera dans différents états en fonction des paramètres du tableau remplissable.
L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.
La méthode fill est une méthode d'attribution d'attributs aux instances Eloquent.
Cliquons sur la méthode fill et jetons d'abord un œil à son code source : Array
La version utilisée par l'auteur voici Laravel 5.5 La dernière version, pour faciliter la lecture, a supprimé le cadre d'annotation
public function fill(array $attributes) { $totallyGuarded = $this->totallyGuarded(); foreach ($this->fillableFromArray($attributes) as $key => $value) { $key = $this->removeTableFromKey($key); if ($this->isFillable($key)) { $this->setAttribute($key, $value); } elseif ($totallyGuarded) { throw new MassAssignmentException($key); } } return $this; }
Tout d'abord, vous pouvez voir que Laravel appellera d'abord sa propre méthode totalementGuarded. Cliquons sur cette méthode : function
public function totallyGuarded() { return count($this->getFillable()) == 0 && $this->getGuarded() == ['*']; }
. Vous pouvez voir l'effet de cette méthode. Il s'agit d'obtenir ses propres éléments remplissables et gardés, puis de déterminer s'ils sont tous dans un état non assignable par lots, et enfin de renvoyer une valeur booléenne ceci
// 返回一个 True or False 的布尔值 // 若是未设置 fillable 与 guarded,则会返回 True (注意,在这种状况下,此 `Model` 是不容许批量赋值任何属性的哦) // 反之则返回 False $totallyGuarded = $this->totallyGuarded();
Ok, revenons à la méthode fill tout à l'heure et continuez à regarder la conception
La suivante est une boucle foreach, mais avant la boucle, Laravel exécute la méthode fillableFromArray sur l'attribut d'affectation entrant. Cliquez dedans et jetez un œil à Code
protected function fillableFromArray(array $attributes) { if (count($this->getFillable()) > 0 && ! static::$unguarded) { return array_intersect_key($attributes, array_flip($this->getFillable())); } return $attributes; }
Cette méthode. détectera si vous avez défini une valeur dans le tableau remplissable. Si une valeur est définie, renverra la valeur qui croise les attributs. Sinon, renverra le propre événement des attributs
, puis reviendra au remplissage après avoir appelé fillableFromArray pour traiter. les paramètres, les seules valeurs renvoyées sont les attributs que nous autorisons l'affectation par lots (si vous avez défini)ip
Bouclez la première ligne, utilisez d'abord RemoveTableFromKey pour traiter la clé du paramètre et supprimez le nom de la table dans la clé. Cette méthode ne sera pas trop expliquée. C'est juste une fonction de fractionnement de chaîne et de valeur rem
$key = $this->removeTableFromKey($key);
En regardant vers le bas, Laravel appelle la méthode isFillable pour chaque attribut qui sera rempli pour s'assurer que cet attribut peut être rempli. un coup d'œil à son code source :
public function isFillable($key) { if (static::$unguarded) { return true; } if (in_array($key, $this->getFillable())) { return true; } if ($this->isGuarded($key)) { return false; } return empty($this->getFillable()) && ! Str::startsWith($key, '_'); }
Vous pouvez voir que dans cette méthode Laravel First, il est jugé si la garde est désactivée pour ce modèle. Si la garde n'est pas activée pour ce modèle, alors True sera renvoyé directement
if (static::$unguarded) { return true; }.
Si la garde est activée, alors il sera jugé si cet attribut existe dans le tableau à remplir. S'il existe, alors renvoie True,
if (in_array($key, $this->getFillable())) { return true; }
Si cette propriété n'existe pas dans le tableau à remplir, alors Laravel déterminera à nouveau si cela est activé. La propriété existe dans le tableau gardé. Si elle existe dans ce tableau, alors cette propriété n'est pas une propriété qui peut être attribuée par lots. Ensuite, elle retournera directement False
if ($this->isGuarded($key)) { return false; }
Si aucune des conditions ci-dessus n'est remplie, alors Laravel déterminera enfin si. son tableau remplissable est vide et cet attribut commence par _, puis renvoie une valeur booléenne
return empty($this->getFillable()) && ! Str::startsWith($key, '_');
puis revient à la méthode fill Ensuite, si cet attribut a été filtré par la méthode isFillable, alors attribuez-lui cet attribut (en raison de limitations temps, la méthode setAttribute ne sera pas discutée en détail ~),
$this->setAttribute($key, $value);
Si elle n'a pas été filtrée par la méthode isFillable, alors Laravel déterminera si votre propre modèle est dans un état qui ne restreint pas l'affectation par lots d'attributs. Sinon, Laravel lancera directement une exception
// 判断此属性是否经过了检测 if ($this->isFillable($key)) { // 将此属性赋值给自身 $this->setAttribute($key, $value); // 若是没有经过检测,那么判断一下自身 `Model` 是否为所有不可批量赋值状态,若是是,那么会抛出一个 `Exception` } elseif ($totallyGuarded) { throw new MassAssignmentException($key); }
Après avoir détecté et attribué tous les attributs, Laravel se retournera lui-même
return $this ;
L'analyse est terminée, ce qui précède est le code source de la méthode de remplissage~, et enfin un résumé
Lorsque vous appelez la méthode fill, Laravel détectera d'abord l'état du modèle actuel,
Lorsque vous définissez le tableau remplissable, Lorsque le tableau gardé n'est pas défini, alors ce modèle sera dans un état qui peut n'attribuez que les attributs spécifiés par lots
Lorsque vous ne définissez pas un tableau remplissable, mais définissez un tableau gardé, alors ce modèle sera dans un état qui peut attribuer n'importe quel attribut par lots
Quant à je ne discuterai pas de la situation où vous définissez des tableaux remplissables et gardés en même temps, car cela est interdit par Laravel
Ensuite, appelez fillableFromArray pour obtenir l'intersection des attributs et des tableaux remplissables. Si vous ne définissez pas fillable ou ne le désactivez pas Guard, alors cette méthode le fera directement. renvoie les attributs
puis Laravel fera une boucle sur le tableau renvoyé. Dans cette boucle, Laravel appellera la méthode isFillable sur chaque attribut pour vérifier si l'attribut peut être rempli s'il n'est pas détecté par cette méthode (n'existe pas. dans le tableau remplissable et n'a pas de tableau gardé ou existe dans un tableau gardé), alors Laravel détectera si le modèle actuel est dans un état qui ne peut attribuer que des propriétés spécifiées par lots. Si tel est le cas, il lancera directement une exception
.puis Laravel renverra $this après avoir terminé l'opération d'affectation
[Recommandation associée : tutoriel vidéo laravel]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!