Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
J'ai quelque souci avec Doctrine. J'ai un formulaire, en mode édition. Voici le code :
[lang=php] $articleService = $this->getServiceLocator()->get('Application\Service\ArticleService'); $article = $articleService->getById($id); $form->bind($article); $form->get('submit')->setValue('Edit'); if ($this->request->isPost()) { $post = $this->request->getPost(); $form->setData($post); if ($form->isValid()) {
Dans mon formulaire aucun champ n'est pré-rempli.
Voici le formulaire :
[lang=php]namespace Application\Form; use Zend\Form\Form; use Zend\Form\Element; use Zend\InputFilter\InputFilterProviderInterface; use Zend\Stdlib\Hydrator\ClassMethods; use Application\Entity\Article; class ArticleForm extends Form implements InputFilterProviderInterface { public function __construct() { parent::__construct('article-form'); $this->setAttribute('method', 'post'); $this->setAttribute('class', 'form-horizontal'); $this->setHydrator(new ClassMethods(false)) ->setObject(new Article());
Si je fais un dump de $article j'obtiens ceci :
[lang=php]object(Application\Entity\Article) protected 'id' => int 9 protected 'author' => object(DoctrineORMModule\Proxy\__CG__\ZfcUserDoctrineORM\Entity\User) private '_entityPersister' => object(Doctrine\ORM\Persisters\BasicEntityPersister) protected '_class' => object(Doctrine\ORM\Mapping\ClassMetadata) ... protected '_conn' => object(Doctrine\DBAL\Connection) ... protected '_platform' => object(Doctrine\DBAL\Platforms\MySqlPlatform) ... protected '_em' => object(Doctrine\ORM\EntityManager) ... protected '_queuedInserts' => array (size=0) ... protected '_rsm' => null protected '_columnTypes' => array (size=0) ... protected 'quotedColumns' => array (size=0) ... private '_insertSql' => null protected '_selectColumnListSql' => null protected '_selectJoinSql' => null protected '_sqlAliasCounter' => int 0 protected '_sqlTableAliases' => array (size=0) ... protected 'quoteStrategy' => object(Doctrine\ORM\Mapping\DefaultQuoteStrategy) ... private '_identifier' => array (size=1) 'id' => string '1' (length=1) public '__isInitialized__' => boolean false protected 'id' => null protected 'username' => null protected 'email' => null protected 'displayName' => null protected 'password' => null protected 'state' => null
On voit que pour author ces attribues sont tous null, et doctrine me génère un proxy pour zfcuser.
Est-ce que c'est le proxy qui bloque le binding du formulaire ?
Pourquoi Doctrine me génère un un fichier proxy ?
J'ai lu que c’était pas bien qu'il génère ca.
Merci d'avance, j'espère avoir été un minimum claire
Dernière modification par alien7 (12-02-2013 13:56:10)
Hors ligne
Résolu en partie, le binding marche, en fait il me manquait les getters. En fait je n'ai pas écrit les getters et les setters dans mon Entity, j'utilise __get et __set plutot. Mais apparemment il faut les getters et les setters.
Il me reste le problème du fichier proxy généré par Doctrine pour l'entity Zfcuser. En fait je ne comprends pas vraiment ce que fait ce fichier et dans quel cas il est généré.
Dernière modification par alien7 (11-02-2013 16:14:24)
Hors ligne
Salut,
Effectivement tu utilises l'hydrateur ClassMethods qui repose sur les getters et les setters. Par ailleurs, je te conseille d'utiliser l'hydrateur de DoctrineModule qui est bien plus puissant dès que les relations entrent en jeu.
Pour le proxy c'est tout à fait normal. En fait, quand tu récupères un objet via Doctrine, il va automatiquement charger tous les champs simples (Date, string...), par contre pour les associations (OneToOne, ManyToOne...), pour éviter de faire plusieurs requêtes inutiles, charge à la place un proxy. Un proxy est un objet qui hérite de l'objet de base (en l'occurrence dans ton exemple, DoctrineORMModule\Proxy\__CG__\ZfcUserDoctrineORM\Entity\User hérite de User).
C'est ce qu'on appelle le lazy-loading. Par contre, lorsque tu feras, par exemple : $article->getAuthor()->getName(), là tu tentes d'accéder à une propriété d'un auteur. Par conséquent, Doctrine va à ce moment là initialiser le proxy en effectuant une requête en base pour récupérer l'auteur. C'est totalement transparent pour l'utilisateur final. Evidemment, tu peux avoir envoie de TOUJOURS charger l'auteur en chargeant l'article, parce que tu sais que tu vas toujours accéder à l'auteur quand tu as un article (en gros, tu veux faire la jointure). Evidemment Doctrine le permet via le DQL, ou avec des annotations.
Hors ligne
Merci Bakura pour ces explications
Et j'utilise maintenant l'hydrateur de DoctrineModule
Voilà Merci encore
Hors ligne