Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-07-2014 15:44:52

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Doctrine Module : que se passe t'il lors du persist d'une entité ?

Bonjour,

Je me suis fabriqué un exemple simple de mise à jour d'une entité Doctrine avec Zend Form et l'hydrator de DoctrineModule.

Tout fonctionne, mais j'ai une interrogation concernant l'update des données (action edit) : lorsque je récupère les données provenant du POST, je les injectes dans la form.
=> si je fais persist($entity) => erreur
=> si je fais directement un flush => mes données modifiées sont sauvegardées.

Et là, je ne comprends plus... Pourquoi mon entity a tout son contenu NULL au niveau du persist (qui logiquement génère une erreur) et le flush (tout seul) fonctionne ???? Le doctrine module hydrator intervient-il à cette étape ?

Là, je sèche... Merci de me transmettre votre avis.

L'extrait de code de l'action "edit" :

Code:

       public function editAction() {
        // create the form and inject the Service Manager
        $form = new VerysimpleForm($this->getObjectManager());
        // Inject a new Doctrine Module Hydrator  in form
        $form->setHydrator(new DoctrineHydrator($this->getObjectManager()));

        if (!$this->request->isPost()) { // NOT POST
            // Data aren't post, so seach data, hydrate the object and display form
            // Get the id 
            $id = (int) $this->params()->fromRoute('id', 0); // TODO vérifier que le "find" trouve un enregistrement
            // Search the Entity for this id
            $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id);
            // bind entity to the form
            $form->bind($verysimple);
            // on affiche alors la form
        } else { // POST
            // Create an empty entity
            $verysimple = new Verysimple();
            // bind entity to the form
            $form->bind($verysimple);
            // if the request is POST, Hydrate the Verysimple entity
            $form->setData($this->request->getPost());

            if ($form->isValid()) {
                //die(var_dump($verysimple)); => $verysimple is empty !!!
                //$this->getObjectManager()->persist($verysimple); ==> error if I persist the entity !!!!
                $this->getObjectManager()->flush(); // save the modified data
                // back to the index action of this controller
                return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index'));
            }
        }
        return new ViewModel(array('form' => $form));
    }

et  code complet du controlleur :

Code:

<?php

/*
 * Very simple controller on Verysimple Entity
 * 
 * Use Zend Form and the DoctrineModule Hydrator for hydrating the entity
 */

namespace Test\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Doctrine\ORM\EntityManager;
//use Doctrine\ORM\EntityRepository; // nécessaire pour editAction
// DoctrineModule Hydrator
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
// use the Verysimple entity !
use Test\Entity\Verysimple;
use Test\Form\VerysimpleForm;

class VerysimpleController extends AbstractActionController {

    protected $_objectManager;

    protected function getObjectManager() {
        if (!$this->_objectManager) {
            $this->_objectManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
        }
        return $this->_objectManager;
    }

    public function indexAction() {
        // Show list
        // see the **getObjectManager** function in this controller
        $verysimple = $this->getObjectManager()->getRepository('\Test\Entity\Verysimple')->findAll();
        // die(var_dump($verysimple));
        // ATTENTION le "s" en fin de verysimple est passé à la vue !!!(à corriger...)
        return new ViewModel(array('verysimples' => $verysimple));
    }

    public function addAction() {
        // create the form and inject the Service Manager
        $form = new VerysimpleForm($this->getObjectManager());
        // Hydrator
        $form->setHydrator(new DoctrineHydrator($this->getObjectManager()));

        // create a new, empty entity and bind it to the form
        $verysimple = new Verysimple();
        $form->bind($verysimple);

        //$request = $this->getRequest();
        if ($this->request->isPost()) {
            //die(var_dump($this->request->getPost()));
            $form->setData($this->request->getPost());

            if ($form->isValid()) {
                //die(var_dump($verysimple));
                $this->getObjectManager()->persist($verysimple);
                $this->getObjectManager()->flush();
                // back to the index action of this controller
                return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index'));
            }
        }

        return new ViewModel(array('form' => $form));
    }

    public function editAction() {
        // create the form and inject the Service Manager
        $form = new VerysimpleForm($this->getObjectManager());
        // Inject a new Doctrine Module Hydrator  in form
        $form->setHydrator(new DoctrineHydrator($this->getObjectManager()));

        if (!$this->request->isPost()) { // NOT POST
            // Data aren't post, so seach data, hydrate the object and display form
            // Get the id 
            $id = (int) $this->params()->fromRoute('id', 0); // TODO vérifier que le "find" trouve un enregistrement
            // Search the Entity for this id
            $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id);
            // bind entity to the form
            $form->bind($verysimple);
            // on affiche alors la form
        } else { // POST
            // Create an empty entity
           $verysimple = new Verysimple();
            // bind entity to the form
            $form->bind($verysimple);
            // if the request is POST, Hydrate the Verysimple entity
            $form->setData($this->request->getPost());

            if ($form->isValid()) {
                //die(var_dump($verysimple)); => $verysimple is empty !!!
                //$this->getObjectManager()->persist($verysimple); ==> error if I persist the entity !!!!
                $this->getObjectManager()->flush(); // save the modified data
                // back to the index action of this controller
                return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index'));
            }
        }
        return new ViewModel(array('form' => $form));
    }

    public function deleteAction() {
        $id = (int) $this->params()->fromRoute('id', 0);
        $verysimple = $this->getObjectManager()->find('\Test\Entity\Verysimple', $id);

        if ($this->request->isPost()) {
            $this->getObjectManager()->remove($verysimple);
            $this->getObjectManager()->flush();
            return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index'));
        }

        return new ViewModel(array('verysimple' => $verysimple));
    }

        public function InitdataAction() {
        // Insert some data for test : all with Doctrine !
        for ($i = 1; $i < 10; $i++) {
            $firstname = 'Firstname' . $i;
            $lastname = 'Lastname' . $i;
            $verysimple1 = new \Test\Entity\verysimple();
            $verysimple1->setFirstname($firstname);
            $verysimple1->setLastname($lastname);
            $objectManager = $this->getObjectManager()->persist($verysimple1);
            $objectManager = $this->getObjectManager()->flush();
        }
        // go to the index action
        return $this->redirect()->toRoute('Test/default', array('controller' => 'verysimple', 'action' => 'index'));
    }
}

Merci de votre retour.

Jean

Dernière modification par jean (11-07-2014 13:31:51)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages