zend-framework doctrine2 zend-framework2

zend framework 2 modelos con doctrina 2



zend-framework doctrine2 (3)

En cuanto a su pregunta actualizada:

Sus entidades y el resto del código utilizado en un módulo es "visible" dentro de cada uno de los otros módulos, solo ejemplifíquelo a través de

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

o lo que sea que necesites Solo asegúrese de tener todos sus módulos registrados en la configuración de su aplicación.

Intento entender Zend Framework 2. Para eso, comencé con el tutorial de Ron Allen http://akrabat.com/getting-started-with-zend-framework-2/ y luego, integro la doctrina 2, usando el tutorial http : //www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/ ok, antes de eso decido hacerlo más complejo.

Cambio la base de datos a lo siguiente:

-- -- 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 ;

Mi aplicación tiene esta estructura:

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

Mis nuevas entidades son así:

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(); } ... }

¡Pero no funciona! Tengo este mensage:

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

Entonces mi pregunta es: ¿Qué está mal? Mis entidades están en el lugar equivocado? o mi organización de módulo no está bien? ¿Cómo puedo hacer que una entidad sea visible para más de un módulo?

ACTUALIZAR:

Cambio mis entidades a:

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; ... }

Pero tengo el mismo error:

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

ACTUALIZACIÓN 2:

Cambié la estructura de mi aplicación a:

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

¡entonces mis entidades están en el mismo espacio de nombres y ahora mi programa está funcionando! =)

Pero todavía tengo la pregunta: ¿cómo puedo hacer que una entidad sea visible para más de una mudule en ZF2?


Por defecto, Doctrine 2 buscará en el mismo espacio de nombres como la entidad actual para sus entidades relacionadas. Algo como:

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

Será necesario. Descargo de responsabilidad: no he usado ZF2. Supongo que las rutas de los cargadores de clase están configuradas.


¡Encontré la respuesta! = D

Debo esperar 8 horas para responder mi propia pregunta, así que aquí vamos.

Como dije, reproduzco el tutorial http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

Enseñan cómo configurar el módulo para que funcione con Doctrine 2. En el módulo de archivo / Album / config / module.config.php insertan el siguiente código:

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'' ), ), ), ), ),

De acuerdo con el tutorial:

"Esto le dice a Doctrine que las entidades del módulo del Álbum usan el espacio de nombres Álbum / Entidad, y que las clases en ese espacio de nombres se almacenan en $ DIRECCIÓN_proyecto_ / módulo / álbum / src / álbum / entidad."

entonces, existe el problema! Doctrine fue configurado para usar solo Album / Entity! así que cambié el código a lo siguiente (con mala programación ... lo siento):

//... ''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'' ), ), //...

Como puede ver, configuro un controlador de ''artista'' ...

¡Ahora mi aplicación funciona correctamente! =)

Todavía estoy buscando la forma correcta de configurar la doctrina en mi aplicación, ¡pero al menos obtuve la respuesta!

Gracias a todos! :)