Doctrine + CodeIgniter:在生成具有命名空间的实体后,在模式创建时“无法重新声明类”

时间:2011-09-12 04:09:24

标签: codeigniter namespaces doctrine entities

我尝试使用注释在CodeIgniter 2.0下使用Doctrine生成实体和数据库模式。我不确定我是否正确地这样做了。  我已经设置了只定义了类名和属性的基类,然后进行了注释。我尝试使用generate-entities命令创建get / set方法。

<?php  
namespace Entities;

include('ContentItem.php');


/**
 * @Entity
 * @Table(name="blobs")
 */
class Blob extends ContentItem {    

/**
 * @var ContentItemId
 *
 * @ManyToOne(targetEntity="ContentItem")
 * @JoinColumn(name="contentitem_id", referencedColumnName="id")
 */
 protected $contentitem;

/**
 * @Column(type="string", length=64, nullable=true)
 */
protected $content;

/**
 * @Column(name="date_created", type="datetime", nullable=false)
 */
protected $date_created;

/**
 * @Column(type="datetime", nullable=false)
 */
protected $date_updated;
}

此文件位于名为&#39; models&#39;的文件夹中。如果我运行命令&#39; orm:generate-entities models&#39;,那么它会在&#39; / models / Entities&#39;内创建新类。夹。这只是因为名称空间实体&#39;宣言。如果我运行&#39; orm:schema-tool:create&#39;为了尝试创建我的数据库模式,我得到:&#34;致命错误:无法在第11行和第34行的/Users/rw3iss/Sites/ci/application/models/Entities/Blob.php中重新声明类Entities \ Blob。 发生这种情况是因为生成的模型/实体&#39;类从父级&#39;模型中生成的文件继承命名空间。文件夹,因此双重冲突。

现在,如果我从父文件中删除名称空间声明,并调用生成实体,则传递&#39; models / Entities&#39;作为目的地,我得到相同的文件布局。除此之外,当我尝试在我的代码中使用模型时:

$blob = new Entities\Blob;

这会引发同样的错误,显然是因为仍有两个具有相同名称的类,没有命名空间。

我已经像这样声明了Entities类加载器:

$entityClassLoader = new \Doctrine\Common\ClassLoader('Entities', APPPATH.'models');

所以我的问题是:

无论如何,从基本类(其中为类和属性声明了我的注释)生成这些实体类,保留名称空间,以便我仍然可以使用&new;新实体\ Blob&#39;来实例化它们。 ?如果甚至有一种方法可以告诉生成的类使用从它们生成的文件中使用不同的命名空间,那就没问题了。我想设置基本属性,并拥有生成实体&#39;命令为我创建我的get / set方法。似乎每当我使用命名空间时,它会自动创建命名空间子文件夹中的类,然后我得到“不能重新声明类”#39;错误。

也许我做了一些根本错误的事情......

感谢您的帮助!

更新:解决方案:

我可能通过将Entities文件夹与我的models文件夹并排放置来实现它。如果我将实体ClassLoader更改为仅指向&#39; APPPATH&#39;,然后使用新实体\ Blob&#39;实例化我的实体,则可行。 似乎没有办法将Entities文件夹作为子文件夹放在models文件夹中而不以某种方式抱怨。如果有人知道如何做到这一点,我有兴趣听到。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。那是因为您在命令中指定了一个子文件夹。 只需输入:"orm:generate-entities ."(不带引号)

"."表示实际文件夹。

答案 1 :(得分:0)

我在两个不同的子文件夹中使用实体和模型。以下是我的处理方式:

我的文件结构:

+ framework (root folder)
  index.php
  + entities (model folder)
     Formation.php
     + repositories (repositories folder)
        FormationRepository.php
  + controllers ( controllers folder)
     HomeController.php
index.php中的

require 'vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php';
$entitiesLoader = new ClassLoader('entities', __DIR__);
$entitiesLoader->setFileExtension('.php'); // not necessary, i think that .php is set by default
$entitiesLoader->register();

// registering entities repositories classloader
$repositoriesLoader = new ClassLoader('entities\repositories', __DIR__);
$repositoriesLoader->setFileExtension('.php');
$repositoriesLoader->register();

这是一个实体:(Formation.php)

// Formation.php
<?php
namespace entities;

/**
 * @Entity(repositoryClass="entities\repositories\FormationRepository")
 * @Table(name="formations")
 */
class Formation
{
....

这是我如何使用它:(在HomeController.php中)

// in HomeController.php
<?php
// if i need it directly :
use entities\Formation;
$formation = new Formation();

// if i want to use it with its repository (and Doctrine)
$formation = $this->getApp()->getDbConnection()->getRepository('entities\Formation')->findOneById(1);

注意&#34; getRepository(&#39; entities \ Formation&#39;)&#34;。我的错误是没有指定命名空间&#34; entities \&#34;在实体名称之前。