В качестве новогоднего хакатона я подумал, что я возьму замечательное бета-руководство zend Framework 2 Роба Аллена и заменим doctrine2 вместо Zend \ Db \ Table, используя модули ZF2 SpiffyDoctrine и SpiffyDoctrineORM.
Все шло довольно хорошо, заставил менеджера по сущностям и настроил мою сущность:
<?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 для этого вопроса, я подумал, что проведу тест, чтобы посмотреть, смогу ли я сохранить Entity Manager в базе данных. Я устанавливаю свой код в 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, который попадает в каталог config / autoload приложений.
Вторая часть была в этом файле, я не менял настройки драйвера массива настроек так, чтобы он указывал на:
'driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'namespace' => 'AlbumDoc\Entity',
'paths' => array('module/AlbumDoc/src/AlbumDoc/Entity')
)
Здесь возникает вопрос о том, можно ли каждому модулю содержать свои собственные сущности, если вы устанавливаете глобальный путь к сущности для своего приложения. Но это может подождать еще один день.