2

新年のハッカソンとして、私はRob Allenの素晴らしいzendフレームワーク2ベータチュートリアルを採用し、ZF2モジュールSpiffyDoctrineとSpiffyDoctrineORMを使用してZend \ Db\Tableの代わりにdoctrine2を使用すると考えました。

すべてが順調に進んでおり、エンティティマネージャーを稼働させて、エンティティを設定しました。

<?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とZendFrameworkは初めてなので、エンティティマネージャーをデータベースに保存できるかどうかをテストするつもりでした。次のように、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と関係があると思います。

アルバムモジュールの設定ファイルに追加する必要があるものがあると推測しますが、何が見つかりません。

更新:回答を正式に投稿するのに十分なレピュテーションポイントがないため、ここに回答を追加します。解決策を見つけました。何が悪かったのかには、実際には2つの部分がありました。

最初はばかげた間違いでした。アプリケーションのconfig/autoloadディレクトリにドロップされるmodule.spiffy_doctrine_orm.config.phpファイルの最後から.distを削除するのを忘れました。

2番目の部分はこのファイルにあり、設定配列のドライバー設定を次のように変更しませんでした。

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

これは、アプリケーションのグローバルエンティティパスを設定している場合に、各モジュールが独自のエンティティを保持できるかどうかという疑問を投げかけます。しかし、それは別の日を待つことができます。

4

1 に答える 1

2

(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 に答える