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?
4 Réponses :
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'assistancedata_get
.
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.
Remplacez la propriété de la classe par public $fillable = [
au lieu de protected $fillable = [
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();