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?

mise à jour:

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

Mise à jour 2:

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top