我正在尝试理解Zend Framework 2。 为此,我开始使用Ron Allen的教程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中对多个模块可见?
答案 0 :(得分:2)
我找到了答案! = d
我要等8个小时才能回答我自己的问题,所以我们走了。
正如我所说,我复制了教程http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/
他们教授如何配置模块以使用Doctrine 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,Album模块的实体使用命名空间 Album \ Entity,以及该命名空间中的类存储在其中 $ PROJECT_DIR /模块/专辑/ SRC /专辑/实体“。
所以,有问题! Doctrine配置为仅使用Album \ Entity! 所以我把代码更改为以下(编程错误...抱歉):
//...
'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'
),
),
//...
如您所见,我配置了“艺术家”驱动程序......
现在我的应用程序正常运行! =)
我仍在寻找在我的应用程序中配置学说的正确方法,但至少我得到了答案!
谢谢大家! :)
答案 1 :(得分:1)
关于您更新的问题:
您的实体和一个模块中使用的所有其他代码在每个其他模块中都是“可见的”,只需通过
实例化它$artist = new \Album\Entity\Artist();
或者你可能需要的任何东西。 只需确保在您的应用程序配置中注册所有模块。
答案 2 :(得分:0)
默认情况下,Doctrine 2将查找与相关实体的当前实体相同的命名空间。类似的东西:
* @ORM\ManyToOne(targetEntity="\Artist\Entity\Artist", inversedBy="album")
将需要。免责声明:我没有使用过ZF2。我假设您的类加载器路径都已设置好。