Zend framework zend框架2模型和条令2

Zend framework zend框架2模型和条令2,zend-framework,doctrine-orm,zend-framework2,Zend Framework,Doctrine Orm,Zend Framework2,我试图理解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

我试图理解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中的多个mudule可见?

默认情况下,Doctrine 2将在与当前实体相同的命名空间中查找相关实体。比如:

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

这是需要的。免责声明:我没有使用ZF2。我假设您的类加载器路径都已设置。

关于更新的问题:

一个模块中使用的实体和所有其他代码在另一个模块中都是“可见”的,只需通过

$artist = new \Album\Entity\Artist();
或者你需要的任何东西。 只需确保在应用程序配置中注册了所有模块。

我找到了答案=D

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

正如我所说,我复制了教程

他们教授如何配置模块以使用条令2。 在文件module/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相册模块的实体使用名称空间 相册\实体,并且该命名空间中的类存储在 $PROJECT_DIR/module/Album/src/Album/Entity。“

所以,问题来了! 条令被配置为仅使用相册\实体! 因此,我将代码更改为以下内容(编程错误…抱歉):

正如您所见,我配置了一个“艺术家”驱动程序

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

我仍然在寻找在我的应用程序中配置原则的正确方法,但至少我得到了答案


谢谢大家!:)

嗯,很好。我试试看。但是这样保存我的模型是正确的吗?或者我应该把它们都放在同一个名称空间中?我的意思是,我应该有一个目录“models”,如果我所有的实体都在那里的话?这真的取决于你。symfony2在名称空间等方面更为成熟。您可以浏览文档,看看它们是如何组织的。但教条真的不在乎。只需要知道在哪里查找实体。使用新的实体代码和错误消息更新您的问题。如果错误消息真的是相同的,那么你忘记了更新一些东西。很高兴看到你的工作。条令2确实希望实体位于同一目录中。symfony2有一些包装器代码,允许多个目录,但我从来没有真正查看过细节。至少在ZF2正式发布和更多的人开始使用它之前,你可能是一个人。是的,我想这只是一个ZF2的问题。。。但是没有人能回答我的问题。。。请参阅,如果您有一个
相册模块
(仅使用selectOne和selectAll)和一个
管理模块
(使用selectOne、selectAll、insert、update和delete),您如何组织实体?这是我的问题。。。但非常感谢您的帮助@Cerad!嗯,太好了!但为什么我的学说不起作用?它不断显示错误消息…你问题的最后几行表明没有错误。你能告诉我这个错误吗?
//...
'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'
        ),
    ),
//...