4
votes

Récupérer les champs à remplir dans Laravel

Dans laravel 5.4, je suis capable de récupérer des champs à fillable utilisant l'index fillable de l'instance de modèle.

$model = new AnyClass();
dd($model['fillable']);

Le code ci-dessus imprime tous les champs à AnyClass d' AnyClass . Mais le même code imprime null sur laravel 5.6. Je sais que je peux récupérer des champs à $model->getFillable() utilisant $model->getFillable() . Ma question est quelle est la raison / pourquoi cela ne fonctionne pas dans laravel 5.6 mais fonctionne dans 5.4?


0 commentaires

4 Réponses :


4
votes

D'après le guide de mise à niveau ici, je pense que c'est la réponse à la question:

Méthodes de modèle et noms d'attributs

Pour empêcher l'accès aux propriétés privées d'un modèle lors de l'utilisation de l'accès au tableau, il n'est plus possible d'avoir une méthode de modèle portant le même nom qu'un attribut ou une propriété. Cela entraînera la levée d'exceptions lors de l'accès aux attributs du modèle via l'accès au tableau ( $user['name'] ) ou la fonction d'assistance data_get .


0 commentaires

2
votes

Si vous regardez le code source de Laravel, vous verrez la différence.

La classe Model, qui est étendue par les modèles d'application, implémente l'interface ArrayAccess , qui, entre autres, force la classe à définir la méthode offsetGet .

Dans Laravel 5.4, la méthode offsetGet ressemble à:

public function offsetGet($offset)
{
    return $this->getAttribute($offset);
}

ce qui signifie que si vous appelez $model['fillable'] , vous appelez en fait $model->offsetGet('fillable') qui retourne en fait la propriété fillable de la classe.

Je n'ai pas trouvé la balise Laravel 5.6 mais je suis presque sûr que c'est le même code que Laravel 5.5.45. Dans cette version, la méthode offsetGet été modifiée en:

public function offsetGet($offset)
{
    return $this->$offset;
}

ce qui signifie qu'il renvoie réellement l'attribut s'il est trouvé ou nul dans le cas contraire.


0 commentaires

0
votes

Remplacez la propriété de la classe par public $fillable = [ au lieu de protected $fillable = [


0 commentaires

0
votes

Dans Laravel 7 , je fais cela en appelant la méthode getFillable sur une nouvelle instance de mon modèle. Ainsi:

$model = new MyModel();            
$fillable = $model->getFillable();


0 commentaires