2013-12-08 34 views
4

我正在努力使Doctrine註釋與ZF2 Form註釋一起工作。如何使doctrine和ZF2表單註釋一起工作

我的控制器看起來是這樣的:

namespace Users\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

//Doctrine Stuff 
use Doctrine\ORM\Tools\Setup; 
use Doctrine\ORM\EntityManager; 
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator; 
use DoctrineORMModule\Form\Annotation\AnnotationBuilder; 

class IndexController extends AbstractActionController { 

    private $entityManager; 

    public function getEntityManager() { 
     if (!$this->entityManager) { 
      $paths = array (
        realpath (dirname (__FILE__) . '/../Entity') 
      ); 
      $isDevMode = true; 
      // the connection configuration 
      $dbParams = array (
        'driver' => 'pdo_mysql', 
        'user' => 'root', 
        'password' => 'my_password', 
        'dbname' => 'commapp' 
      ); 
     $config = Setup::createAnnotationMetadataConfiguration ($paths, $isDevMode, null, null, false); 
     $this->entityManager = EntityManager::create ($dbParams, $config); 
     } 
     return $this->entityManager; 
    } 

    public function updateAction() { 
     $entityManager = $this->getEntityManager(); 

     $repository = $entityManager->getRepository ('Users\Entity\User'); 
     $id = $this->params()->fromRoute ('id'); 
     $user = $repository->findOneBy (array('id' => $id)); 

     $builder = new AnnotationBuilder ($entityManager); 
     $form = $builder->createForm ($user); 

     $form->setHydrator (new DoctrineHydrator ($entityManager, 'Users\Entity\User')); 
     $form->bind ($user); 

     $send = new Element ('send'); 
     $send->setValue ('Create'); // submit 
     $send->setAttributes (array ('type' => 'submit')); 
     $form->add ($send); 

     $view = new ViewModel(); 
     $view->setVariable ('form', $form); 
     $view->setVariable ('id', $id); 
     return $view; 
    } 


} 

與實體看起來是這樣的:

namespace Users\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Zend\Form\Annotation as Form; 

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
* @Form\Name("user") 
* @Form\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty") 
*/ 
class User 
{ 

    /** 
    * @var int 
    * @ORM\Id @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue 
    * @Form\Exclude() 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="user_name", type="string", length=255, nullable=false) 
    * @Form\Filter({"name":"StringTrim"}) 
    * @Form\Validator({"name":"StringLength", "options":{"min":1, "max":25}}) 
    * @Form\Validator({"name":"Regex", "options":{"pattern":"/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/"}}) 
    * @Form\Attributes({"type":"text"}) 
    * @Form\Options({"label":"Username:"}) 
    */ 
    protected $username; 

    /** 
    * @var string 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Form\Type("Zend\Form\Element\Email") 
    * @Form\Options({"label":"Your email address:"}) 
    */ 
    protected $email; 

} 

當我輸入網址commapp /用戶/指數/更新/ 1,我應該得到的表格爲ID = 1的用戶顯示。相反,我得到了 Doctrine\Common\Annotations\AnnotationException, 與消息: [Semantical Error] The annotation "@Zend\Form\Annotation\Name" in class Users\Entity\User does not exist, or could not be auto-loaded.

我看不到我在做什麼錯了......?

回答

5

解決了!

由於Doctrine使用自己的自動加載機制,所以需要註冊自動加載名稱空間。我需要使用AnnnotationRegistry和它的registerAutoloadNamespace方法。它接受包含註釋(Zend \ Form \ Annotation)和根名稱空間的基本目錄(在我的情況下爲C:\ Program Files \ Zend \ Apache2 \ htdocs \ CommunicationApp \ vendor \ ZF2 \ library)的命名空間作爲其參數。 點擊此處瞭解詳情:Doctrine Annotations

我的實體現在看起來是這樣的(以及帶學說和Zend表格註釋工作):

namespace Users\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Zend\Form\Annotation; 

use Doctrine\Common\Annotations\AnnotationRegistry; 
$pathToZF2Library = __DIR__.'/../../../../../vendor/ZF2/library/'; 
AnnotationRegistry::registerAutoloadNamespace('Zend\Form\Annotation', $pathToZF2Library); 

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
* @Annotation\Name("Users") 
*/ 
class User { 

    /** 
    * @ORM\Id @ORM\Column(type="integer") 
    * @ORM\GeneratedValue 
    * @Annotation\Type("Zend\Form\Element\Hidden") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string") 
    * @Annotation\Type("Zend\Form\Element\Text") 
    * @Annotation\Filter({"name":"StripTags"}) 
    * @Annotation\Filter({"name":"StringTrim"}) 
    * @Annotation\Validator({"name":"Alnum", "options": {"allowWhiteSpace":"true"}}) 
    * @Annotation\Validator({"name":"StringLength", "options": {"min":"2", "max":"25"}}) 
    * @Annotation\Options({"label":"Username: "}) 
    */ 
    protected $username; 

    /** 
    * @ORM\Column(type="string") 
    * @Annotation\Type("Zend\Form\Element\Email") 
    * @Annotation\Filter({"name":"StripTags"}) 
    * @Annotation\Filter({"name":"StringTrim"}) 
    * @Annotation\Validator({"name":"EmailAddress", "options": {"domain":"true"}}) 
    * @Annotation\Options({"label":"Email: "}) 
    */ 
    protected $email; 

    /** 
    * @ORM\Column(type="string") 
    * @Annotation\Type("Zend\Form\Element\Password") 
    * @Annotation\Filter({"name":"StripTags"}) 
    * @Annotation\Filter({"name":"StringTrim"}) 
    * @Annotation\Options({"label":"Password: "}) 
    */ 
    protected $password; 

    public function __construct() { 
    } 

    public function setId($id) { 
     $this->id = $id; 
    } 

    public function getId() { 
     return $this->id; 
    } 

    public function setUsername($username) { 
     $this->username = $username; 
    } 

    public function getUsername() { 
     return $this->username; 
    } 

    public function setEmail($email) { 
     $this->email = $email; 
    } 

    public function getEmail() { 
     return $this->email; 
    } 

    public function setPassword($password) { 
     $this->password = $password; 
    } 

    public function getPassword() { 
     return $this->password; 
    } 
}