Zend Framework 2 Modèles avec Doctrine 2
-
13-11-2019 - |
Question
J'essaie de comprendre Zend Framework 2. Pour cela, j'ai commencé avec le tutoriel de Ron Allen's Allen http://akrabat.com/geting -Starté - avec-Zend-Framework-2 / Ensuite, j'intègre la doctrine 2, à l'aide du tutoriel http://www.jasongrimes.org/2012/01/USTION-Doctrine-2-in-zend-framework-2/ OK, avant que je décide de le rendre plus complexe.
Je change la base de données en ce qui suit:
--
-- 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 ;
Mon application a cette structure:
module
Album
src
Album
Controller
AlbumController.php
Entity
Album.php
Artist
src
Artist
Controller
ArtistController.php
Entity
Artist.php
Mes nouvelles entités sont comme ç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", 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();
}
...
}
Mais ça ne marche pas! J'ai eu ces menstants:
"The target-entity Album\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."
Donc, ma question est la suivante: qu'est-ce qui ne va pas? Mes entités sont au mauvais endroit? Ou mon organisation de module ne va pas bien? Comment faire une entité peut-elle être visible pour plus d'un module?
Je change mes entités à:
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;
...
}
Mais j'ai la même erreur:
"The target-entity Artist\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."
J'ai changé la structure de ma candidature à:
module
Album
src
Album
Controller
AlbumController.php
ArtistController.php
Entity
Album.php
Artist.php
Alors, mes entités sont dans la même espace de noms et maintenant mon programme, cela fonctionne!=)
Mais j'ai toujours la question: comment puis-je faire une entité pour être visible à plus d'une bouée dans ZF2?
La solution
J'ai trouvé la réponse!= D
Je dois attendre 8 heures pour répondre à ma propre question, alors nous allons ici.
Comme je l'ai dit, je reproduit le tutoriel http://www.jasongrimes.org/2012/01/Utilisation-doctrine-2-in-zend-framework-2/
Ils apprennent à configurer le module pour travailler avec la doctrine 2. Dans le module de fichier / album / config / module.config.php, ils insèrent le code suivant:
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'
),
),
),
),
),
Selon le tutoriel:
"Cela indique à la doctrine que les entités du module d'album utilisent l'espace de noms Album \ entité, et que les classes de cet espace de noms sont stockées dans $ Project_dir / module / album / src / album / entité. "
Alors, il y a le problème! La doctrine a été configurée pour utiliser uniquement l'album \ entité! J'ai donc changé le code ci-dessous (avec une mauvaise programmation ... Désolé):
//... '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' ), ), //...
Comme vous pouvez le voir, je configure un pilote d'artiste ...
Maintenant, mon application fonctionne correctement!=)
Je cherche toujours la bonne façon de configurer la doctrine de mon application, mais au moins j'ai la réponse!
Merci pour tout le monde! :)
Autres conseils
En ce qui concerne votre question mise à jour:
Vos entités et tous les autres code utilisés dans un module sont "visibles" dans l'autre module, il suffit d'instancier via
$artist = new \Album\Entity\Artist();
ou tout ce que vous pourriez avoir besoin. Assurez-vous simplement de disposer de tous vos modules enregistrés dans votre configuration de l'application.
Par défaut Doctrine 2 examinera dans la même espace de noms que l'entité actuelle pour vos entités associées.Quelque chose comme:
* @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")
sera nécessaire.Disclaimer: Je n'ai pas utilisé ZF2.Je suppose que vos chemins de chargeur de classe sont toutes la configuration.