我试图了解Zend Framework 2。
为此,我从罗恩·艾伦的教程http://akrabat.com/getting-started-with-zend-framework-2/开始
然后,我使用http://www.jasongrimes.org/2012/01/using-doctrine-2-in-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();
    }

    ...
}

但这不起作用!
我得到了这个提示:
"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中的多个实体看不到一个实体?

最佳答案

我找到了答案! = D

我必须等待8个小时才能回答自己的问题,所以我们开始吧。

正如我所说,我复制了http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/教程

他们教授如何配置模块以与教义2一起使用。
在文件模块/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相册模块的实体使用 namespace
Album \ Entity,并且该 namespace 中的类存储在
$ PROJECT_DIR /模块/相册/ src /相册/实体。”

所以,有问题!
教义被配置为仅使用专辑\实体!
所以我将代码更改为以下代码(编程错误...抱歉):
//...
'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”驱动程序...

现在我的应用程序可以正常工作了! =)

我仍在寻找在我的应用程序中配置该理论的正确方法,但至少我得到了答案!

谢谢大家! :)

关于zend-framework - zend framework 2带有教义2的模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9468236/

10-12 12:50
查看更多