新年のハッカソンとして、私は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')
)
これは、アプリケーションのグローバルエンティティパスを設定している場合に、各モジュールが独自のエンティティを保持できるかどうかという疑問を投げかけます。しかし、それは別の日を待つことができます。