2

作为元旦黑客松,我想我会采用 Rob Allen 的出色zend 框架 2 测试版教程,并使用 ZF2 模块 SpiffyDoctrine 和 SpiffyDoctrineORM 替换教义 2 而不是 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 有关。

猜测有一些东西需要添加到相册模块的配置文件中,但找不到什么。

更新:由于我没有足够的声誉点来正式发布答案,我将在此处添加答案。找到了解决方案。实际上有两个部分出了问题。

首先是一个愚蠢的错误,我忘了把 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')
)

如果您为应用程序设置全局实体路径,这确实引出了每个模块是否有可能拥有自己的实体的问题。但这可以再等一天。

4

1 回答 1

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'
                        )
                    )
                )
            )
        )
    ),
));

这将在配置中添加一个新驱动程序,而不会触及任何与模块无关的配置文件。

于 2012-01-01T12:56:06.657 回答