2012-02-27 2 views
3

Я пытаюсь понять 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/ ОК, до того, что я решаю чтобы сделать его более сложным.Zend Framework, 2 модели с доктриной 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'." 

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

UPDATE:

изменить мои объекты в:

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'." 

UPDATE 2:

Я изменилструктура моей заявки:

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

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

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

+0

Рад видеть, что вы работали. Doctrine 2 действительно любит объекты, находящиеся в одном каталоге. У Symfony 2 есть некоторый код оболочки, чтобы разрешить несколько каталогов, но я никогда не просматривал детали. Вы можете быть по-своему, по крайней мере, до тех пор, пока ZF2 не будет выпущен, и больше людей начнут его использовать. – Cerad

+0

да, я думаю, это только вопрос ZF2 ... но у меня нет ответа на мои вопросы ... см., Если у вас есть модуль альбома (только с selectOne и selectAll) и 'admin module' (с selectOne , selectAll, вставить, обновить и удалить), как вы организуете свои сущности? вот мой вопрос ... но большое спасибо за вашу помощь @Cerad! – vinigarcia87

ответ

2

Я нашел ответ! = D

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

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

Они учат, как настроить модуль для работы с Doctrine 2. В модуле файл/Альбом/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' 
          ), 
         ), 
        ), 
       ), 
      ), 

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

"This tells Doctrine that the Album module’s entities use the namespace Album\Entity, and that the classes in that namespace are stored in $PROJECT_DIR/module/Album/src/Album/Entity."

так, есть проблема! Doctrine был настроен для использования только 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' 
     ), 
    ), 
//... 

Как вы можете видеть, что я настроить драйвер «Артист» ...

Теперь мое приложение будет работать должным образом! =)

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

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

0

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

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

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

+0

Умм, хорошо. Я попробую. но правильно ли это мои модели? или я должен был поставить все в том же пространстве имен? Я имею в виду, что у меня должны быть «модели» каталогов, если все мои сущности там? – vinigarcia87

+0

не работает. = (С той же проблемой снова ... – vinigarcia87

+0

Это действительно зависит от вас. Symfony 2 немного более зрелый, чем пространства имен и т. Д. Вы можете просмотреть документацию и посмотреть, как они организуют вещи, но Doctrine действительно не " Нужно знать, где искать объект. – Cerad

1

Что касается обновленной вопрос:

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

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

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

+0

Хм, это хорошо! моя доктрина не работает? Она продолжает показывать, что ошибка msg ... – vinigarcia87

+0

Последние строки ваших вопросов предполагают, что нет ошибки. Не могли бы вы поделиться этой ошибкой? –