Maison > cadre php > Laravel > Comment utiliser la méthode de remplissage de Laravel

Comment utiliser la méthode de remplissage de Laravel

WBOY
Libérer: 2022-06-06 15:33:23
original
3727 Les gens l'ont consulté

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.

Comment utiliser la méthode de remplissage de Laravel

L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.

Comment utiliser la méthode fill de Laravel

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;
}
Copier après la connexion

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() == ['*'];
}
Copier après la connexion

. 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();
Copier après la connexion

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;
}
Copier après la connexion

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);
Copier après la connexion

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, '_');
}
Copier après la connexion

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;
}
Copier après la connexion
.

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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, '_');
Copier après la connexion

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);
Copier après la connexion

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);
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal