作为新年的一天,黑客马拉松认为我会使用ZF2模块SpiffyDoctrine和SpiffyDoctrineORM取得Rob Allen的伟大zend framework 2 beta tutorial并替换doctrine2而不是Zend \ Db \ Table。
一切都很顺利,让实体经理去了我的实体:
<?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;
}
}
由于我是该公司的Doctrine和Zend Framework的新手,我想我会做一个测试,看看我是否可以将实体管理器保存到数据库中。我在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有关。
猜测有些东西需要添加到Album模块的配置文件中,但无法找到。
已更新:由于我没有足够的声誉点来正式发布答案,我将在此处添加答案。 找到了解决方案。出现问题实际上有两个部分。
首先是一个愚蠢的错误,我忘了把.dist放在module.spiffy_doctrine_orm.config.php文件的末尾,该文件被放入应用程序配置/自动加载目录。
第二部分是在这个文件中,我没有改变设置数组的驱动程序设置指向:
'driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'namespace' => 'AlbumDoc\Entity',
'paths' => array('module/AlbumDoc/src/AlbumDoc/Entity')
)
如果您正在为应用程序设置全局实体路径,那么这就提出了一个问题:每个模块是否可以拥有它自己的实体。但那可以等一天。
答案 0 :(得分:2)
(解答第二个问题)
是的,这是可能的,并且(在我看来)是要走的路。您的模块的配置只需返回您想要更改/扩展的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'
)
)
)
)
)
),
));
这将添加新配置文件,而不会触及任何与模块无关的配置文件。