与SpiffyDoctrine的ZF2教程

时间:2012-01-01 09:58:22

标签: doctrine-orm zend-framework2

作为新年的一天,黑客马拉松认为我会使用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')
)

如果您正在为应用程序设置全局实体路径,那么这就提出了一个问题:每个模块是否可以拥有它自己的实体。但那可以等一天。

1 个答案:

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

这将添加新配置文件,而不会触及任何与模块无关的配置文件。