Учебник по ZF2 со SpiffyDoctrine - PullRequest
       29

Учебник по ZF2 со SpiffyDoctrine

2 голосов
/ 01 января 2012

В качестве новогоднего хакатона я подумал, что я возьму замечательное бета-руководство 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')
)

Здесь возникает вопрос о том, можно ли каждому модулю содержать свои собственные сущности, если вы устанавливаете глобальный путь к сущности для своего приложения. Но это может подождать еще один день.

1 Ответ

2 голосов
/ 01 января 2012

(отвечая на второй вопрос)

Да, это возможно и (по моему мнению) путь. Конфигурация вашего модуля просто должна вернуть подмножество конфигурации 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'
                        )
                    )
                )
            )
        )
    ),
));

Это добавит новый драйвер в конфигурацию, не затрагивая никакие немодульные файлы конфигурации.

...