首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有理论2的zend框架2模型

具有理论2的zend框架2模型
EN

Stack Overflow用户
提问于 2012-02-27 16:11:29
回答 3查看 6.4K关注 0票数 3

我试图理解ZendFramework2。为此,我从Ron的教程http://akrabat.com/getting-started-with-zend-framework-2/开始,然后,我使用http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/ ok教程集成了理论2,然后我决定让它变得更加复杂。

我将数据库更改为:

代码语言:javascript
复制
--
-- 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 ;

我的应用程序具有以下结构:

代码语言:javascript
复制
module
    Album
        src
            Album
                Controller
                    AlbumController.php
                Entity
                    Album.php
    Artist
        src
            Artist
                Controller
                    ArtistController.php
                Entity
                    Artist.php

我的新实体是这样的:

代码语言:javascript
复制
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();
    }

    ...
}

但这不管用!我得到了这样的建议:

代码语言:javascript
复制
"The target-entity Album\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

所以我的问题是:出什么事了?我的实体来错地方了?还是我的模块组织不好?如何使一个实体对多个模块可见?

更新:

我将我的实体改为:

代码语言:javascript
复制
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;

    ...
}

但我也犯了同样的错误:

代码语言:javascript
复制
"The target-entity Artist\Entity\Artist cannot be found in 'Album\Entity\Album#artist'."

更新2:

我将应用程序的结构更改为:

代码语言:javascript
复制
module
    Album
        src
            Album
                Controller
                    AlbumController.php
                    ArtistController.php
                Entity
                    Album.php
                    Artist.php

所以我的实体在同一个名称空间中,现在我的程序开始工作了!=)

但是,我仍然有一个问题:如何使一个实体在ZF2中对多个mudule可见?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-28 11:36:25

我找到了答案!

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

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

他们教授如何将模块配置为使用Doctrine 2。在文件模块/相册/config/module.config.php中,它们插入以下代码:

代码语言:javascript
复制
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,相册模块的实体使用名称空间相册\Entity,并且该名称空间中的类存储在$PROJECT_DIR/module/相册/src/相册/实体中。

所以,这就是问题所在!原则被配置为只使用专辑\实体!因此,我将代码更改为以下代码(使用糟糕的编程.对不起):

代码语言:javascript
复制
//...
'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'
        ),
    ),
//...

如你所见我配置了一个“艺术家”驱动程序..。

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

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

谢谢大家!)

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 18:56:14

关于你最新的问题:

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

代码语言:javascript
复制
$artist = new \Album\Entity\Artist();

或者任何你需要的东西。只需确保在应用程序配置中注册了所有模块。

票数 1
EN

Stack Overflow用户

发布于 2012-02-27 16:29:11

默认情况下,Doctrine 2将在与相关实体的当前实体相同的名称空间中查找。类似于:

代码语言:javascript
复制
 * @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")

将是必要的。免责声明:我没有使用ZF2。我假设您的类加载程序路径都已经设置好了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9468236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档