Doctrine 2 Quel est le moyen recommandé pour accéder aux propriétés?
Je me souviens avoir lu que dans la Doctrine 2 modèles, je ne devrais pas définir les propriétés des champs public. Alors, comment voulez-vous exposer ces champs? Le bac à sable utilisé get*()
& set*()
méthodes. C'est que la meilleure idée? Son très lourd. À l'aide de méthodes magiques __get()
__set()
va rendre les choses similaire à la définition des domaines public?
Ce qui est de votre recommandation?
source d'informationauteur Jiew Meng
Vous devez vous connecter pour publier un commentaire.
Voici pourquoi vous ne pouvez pas utiliser les propriétés publiques: Comment peut-champs publics “pause chargement paresseux” dans la Doctrine 2?
Il est exact que les
__get()
et__set()
peut rendre l'accès à laprotected
/private
champs plus facile.Voici un exemple simple:
De cours qui donne accès à toutes les propriétés. Vous pourriez mettre que dans une classe que tous vos entités, puis définir non cotisables champs
private
. Ou vous pouvez utiliser un tableau pour déterminer quelles propriétés doivent être accessibles:$this->accessable = array('name', 'age')
Il ya beaucoup de façons de garder toutes les propriétés protégées et ont encore une assez facile pour les définir.
Personnellement, je n'aime pas du code réutilisable avec trivial objectif - il rend le code laid et ennuyeux à lire. Donc, je préfère largement
__get
/__set
. Cela dit, ils ont quelques inconvénients:__get
/__set
seulement qui est appelé lorsque le champ n'est pas visible; si vous accédez aux propriétés dans le code de la classe d'entité, ils ne sont pas appelés, et que le proxy n'a aucune chance de se charger. (Doctrine essaie d'éviter cela en instantanément le chargement du proxy dès que l'un de ses méthodes publiques sont appelés, mais il existe quelques exceptions comme__construct
ou__wake
où cela n'aurait pas de sens, de sorte que vous pouvez avoir des ennuis, par exemple par la lecture d'un champ dans le constructeur.)empty($entity->field)
ne sera pas invoquer__get
(et donc il va se casser proxy comportement si utilisé)Si certaines informations doivent être rendues publiques, définir un getter pour elle.
Si c'est modifiable, ajouter un setter (même mieux, ajouter un fluide setter!).
De l'API sont nettoyeur de cette façon, avec pas quelque chose de magique.
Je n'aime pas la magie dans mon code.
Juste mes deux cents 🙂
Par "fluent setter" je voulais une mise en œuvre de la interface fluide motif.
Oui getter et setter sont le moyen d'accéder à vos données. Ils sont un peu fastidieux, c'est pourquoi certaines personnes n'aiment pas doctrine2 ou mise en veille prolongée. Mais vous ne devez le faire qu'une fois pour chaque entité et puis ils sont très flexibles pour produire la sortie mise en forme que vous espérez pour. Vous pouvez utiliser la cli pour faire une partie de cela pour vous. Mais quand vous obtenez rouler, je ne trouve pas de gros problème. Surtout depuis que vous le faire uniquement pour les propriétés dont vous avez besoin.
Acclamations
Plutôt que de devoir les séparer des accesseurs et des mutateurs, ou même en utilisant les fonctions magiques.. il Est de problème avec le fait d'avoir quelque chose comme cela dans la classe
C'est tellement facile d'accéder aux attributs et les moyens qu'ils seront de définir de façon dynamique à partir de la paire de clés tableaux.. tous les commentaires? ou d'autres suggestions?
Doctine 2 fournit un [outil de ligne de commande][1] pour générer de l'entité de base des classes
utilisez la commande suivante pour obtenir une Entité de base de la définition de classe de votre cartographie, complet avec getter/setter fonctions pour chaque propriété:
path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/
Vous êtes toujours responsable de la modification de chaque getter/setter pour s'assurer qu'ils sont le bon type de données, comme les getter/setter généré pour l'Entité ne pas faire n'importe quel type de coulée/conversion.