2012-01-01 37 views
2

作爲元旦黑客馬拉松認爲我會採取羅布艾倫的偉大的zend framework 2 beta tutorial和取代Zend \ Db \ Table使用ZF2模塊SpiffyDoctrine和SpiffyDoctrineORM替代doctrine2。ZF2教程與SpiffyDoctrine

一切都進行得非常好,得到了實體管理器會,並設置我的實體:

<?php 

namespace AlbumDoc\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="album") 
*/ 
class Album { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer"); 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    public $artist; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    public $title; 

    /** 
    * global getter 
    * 
    * @param type $property 
    * @return type 
    */ 
    public function __get($property) { 
     return $this->$property; 
    } 

    /** 
    * Global setter 
    * 
    * @param type $property 
    * @param type $value 
    */ 
    public function __set($property, $value) { 
     $this->$property = $value; 
    } 

} 

由於我是新來的教義和Zend框架爲母校,我想我會做一個試驗,看看我是否可以將Entity Manager保存到數據庫。設置我的indexController的代碼如下:

$em = $this->getLocator()->get('doctrine_em'); 

$album = new \Application\Entity\Album(); 
$album->artist = 'Art Ist'; 
$album->title = 'Cool Title'; 

$em->persist($album); 
$em->flush(); 

的問題我有它,當這個代碼運行,我得到了以下錯誤:

Class Application\Entity\Album is not a valid entity or mapped super class. 

從有限的東西,我已經找到我認爲這個問題與Doctrine不知道實體路徑或與AnnotationDriver有關的事情有關。

猜測有一些需要添加到相冊模塊的配置文件,但無法找到什麼。

已更新:由於我沒有足夠的信譽點正式發佈答案,因此我會在此處添加答案。 找到解決方案。實際上有兩部分是出了什麼問題。

首先是一個愚蠢的錯誤,我忘了將module.spiffy_doctrine_orm.config.php文件的末尾的.dist放到應用程序的config/autoload目錄中。

第二部分是在這個文件中,我並沒有改變設置陣列的驅動程序設置爲指向:

'driver' => array(
    'class'  => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
    'namespace' => 'AlbumDoc\Entity', 
    'paths'  => array('module/AlbumDoc/src/AlbumDoc/Entity') 
) 

這並不乞求它是否能夠爲每個模塊用來放置問題它是自己的實體,如果你正在爲你的應用程序設置全局實體路徑。但那可以等待另一天。

+0

此外,eAccelerator沒有在我的MAMP本地機器上運行 – Jaijaz 2012-01-01 10:07:58

回答

2

(Anwering第二個問題)

是的,這是可能的,(在我oppinion)的路要走。您的模塊配置只需返回要更改/擴展的orm配置的子集。 不幸的是,Doctrine的驅動似乎不支持多個命名空間。因此,你必須添加一個新的驅動程序爲每個命名空間(不知道這一點,糾正我,如果我錯了:)

要添加新的驅動程序,讓你模塊的配置包含這樣的內容:

return array(
'di' => array(
    'instance' => array(
     'orm_driver_chain' => array(
      'parameters' => array(
       'drivers' => array(
        'mymodule' => array(
         'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
         'namespace' => __NAMESPACE__ . '\Entity', 
         'paths' => array(
          __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity' 
         ) 
        ) 
       ) 
      ) 
     ) 
    ), 
)); 

這將添加一個新的驅動程序的配置,而不觸及任何非模塊相關的配置文件。

+0

謝謝。我已經嘗試了這條線很長的一些東西,但可以找出正確的參數來使其工作。 – Jaijaz 2012-01-01 21:15:07

+0

作爲更新,我必須用實際名稱空間替換__NAMESPACE__,才能使其正常工作。猜測你不能動態地拉動命名空間。 – Jaijaz 2012-01-01 23:03:41

+0

我的錯 - 你也可以在配置文件中定義一個命名空間;) – Fge 2012-01-01 23:49:35