Zend Framework 2 модели с доктриной 2 - PullRequest
3 голосов
/ 27 февраля 2012

Я пытаюсь понять Zend Framework 2. Для этого я начал с учебника Рона Аллена http://akrabat.com/getting-started-with-zend-framework-2/, затем я интегрировал учение 2, используя учебник http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/ хорошо, прежде чем я решилчтобы сделать его более сложным.

Я изменяю базу данных следующим образом:

--
-- Estrutura da tabela `album`
--
CREATE TABLE IF NOT EXISTS `album` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `artist_id` int(11) NOT NULL,
  `title` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `artist` (`artist_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;

--
-- Estrutura da tabela `artist`
--
CREATE TABLE IF NOT EXISTS `artist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

Мое приложение имеет такую ​​структуру:

module
    Album
        src
            Album
                Controller
                    AlbumController.php
                Entity
                    Album.php
    Artist
        src
            Artist
                Controller
                    ArtistController.php
                Entity
                    Artist.php

Мои новые сущности такие:

class Album {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\ManyToOne(targetEntity="Artist", inversedBy="album")
     * @ORM\JoinColumn(name="artist_id", referencedColumnName="id")
     */
    protected $artist;

    ...
}
class Artist {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="Album", mappedBy="artist")
     */
    protected $album;


    public function __construct()
    {
        $this->album = new ArrayCollection();
    }

    ...
}

Но это не работает!Я получил это mensage:

"The target-entity Album\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

Итак, мой вопрос: что не так?Мои сущности находятся не в том месте?или мой модуль организации не в порядке?Как сделать одну сущность видимой для нескольких модулей?

ОБНОВЛЕНИЕ:

Я изменяю свои сущности на:

class Album {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
     * @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")
     * @ORM\JoinColumn(name="artist_id", referencedColumnName="id")
     */
    protected $artist;

    ...
}
class Artist {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="\Album\Entity\Album", mappedBy="artist")
     */
    protected $album;

    ...
}

НоЯ получил ту же ошибку:

"The target-entity Artist\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

ОБНОВЛЕНИЕ 2:

Я изменил структуру моего приложения на:

module
    Album
        src
            Album
                Controller
                    AlbumController.php
                    ArtistController.php
                Entity
                    Album.php
                    Artist.php

, поэтому мойсущности находятся в одном пространстве имен и теперь моя программа работает!=)

Но у меня все еще есть вопрос: как я могу сделать одну сущность видимой для более чем одного модуля в ZF2?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Я нашел ответ! = D * * тысяча одна

Мне нужно подождать 8 часов, чтобы ответить на мой собственный вопрос, так что поехали.

Как я уже говорил, я воспроизводлю учебник http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

Они учат, как настроить модуль для работы с Doctrine 2. В файле module / Album / config / module.config.php они вставляют следующий код:

return array(
    'di' => array(
        'instance' => array(
            // ...
            'orm_driver_chain' => array(
                'parameters' => array(
                    'drivers' => array(
                        'Album' => array(
                            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                            'namespace' => __NAMESPACE__ . '\Entity',
                            'paths' => array(
                                __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'
                            ),
                        ),
                    ),
                ),
            ),

Согласно учебнику:

"Это говорит Doctrine о том, что сущности модуля Album используют пространство имен Album \ Entity, и что классы в этом пространстве имен хранятся в $ Project_dir / модуль / Альбом / SRC / Альбом / Entity. "

Итак, проблема есть! Доктрина была настроена на использование только Album \ Entity! поэтому я изменил код на следующий (с плохим программированием ... извините):

//...
'drivers' => array(
    'Album' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'namespace' => __NAMESPACE__ . '\Entity',
        'paths' => array(
            __DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'
        ),
    ),
    'Artist' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'namespace' => '\Artist\Entity',
        'paths' => array(
            __DIR__ . '/../../Artist/src/Artist/Entity'
        ),
    ),
//...

Как видите, я настраиваю драйвер 'Artist' ...

Теперь мое приложение работает правильно! =) * +1022 *

Я все еще ищу правильный способ настройки доктрины в моем приложении, но по крайней мере я получил ответ!

Спасибо всем! :)

1 голос
/ 27 февраля 2012

По поводу вашего обновленного вопроса:

Ваши сущности и весь другой код, используемый в одном модуле, «видим» внутри каждого другого модуля, просто создайте его экземпляр с помощью

$artist = new \Album\Entity\Artist();

или что вам может понадобиться. Просто убедитесь, что все ваши модули зарегистрированы в конфигурации вашего приложения.

0 голосов
/ 27 февраля 2012

По умолчанию Doctrine 2 будет выглядеть в том же пространстве имен, что и текущий объект для связанных объектов. Что-то вроде:

 * @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")

Будет необходимо. Отказ от ответственности: я не использовал ZF2. Я предполагаю, что все пути вашего загрузчика классов настроены.

...