Doctrine + CodeIgniter: после создания сущностей с пространством имен «не может повторно объявить класс» при создании схемы - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь создать сущности и схему базы данных с помощью Doctrine под CodeIgniter 2.0, используя аннотации. Я не уверен, правильно ли я это делаю. Я настроил базовые классы, в которых определены только имя класса и свойства, а затем аннотированы. Я пытаюсь использовать команду generate-entity, чтобы она создала методы 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;
}

Этот файл находится в папке с именем «models». Если я запускаю команду 'orm: generate-entity models', то она создает новые классы внутри папки '/ models / Entities'. Это происходит только из-за объявления сущностей пространства имен. Если я запускаю 'orm: schema-tool: create', чтобы попытаться создать схему базы данных, я получаю: "Неустранимая ошибка: невозможно переопределить класс Entities \ Blob в / Users / rw3iss / Sites / ci / application / models / Entities / Blob" .php в строке 11 ". Это происходит потому, что сгенерированные классы «models / Entities» наследуют пространство имен из файлов, из которых они сгенерированы в родительской папке «models», поэтому возникает конфликт двух классов.

Теперь, если я удалю декларацию пространства имен из родительских файлов и вызову генерировать сущности, передавая «models / Entities» в качестве места назначения, я получу ту же структуру файлов. Кроме того, при попытке использовать модели в моем коде:

$blob = new Entities\Blob;

это выдает ту же ошибку, очевидно, потому что есть еще два класса с одинаковыми именами без пространства имен.

Я объявил загрузчик класса Entities следующим образом:

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

Итак, мой вопрос:

В любом случае можно ли сгенерировать эти классы сущностей из базового класса (в котором мои аннотации объявлены для этого класса и свойств), сохраняя пространства имен, чтобы я по-прежнему мог создавать их экземпляры с помощью 'new Entities \ Blob'? Если бы даже был способ указать сгенерированным классам использовать другое пространство имен из файла, из которого они сгенерированы, это было бы хорошо. Я хотел бы настроить основные свойства, и чтобы команда 'generate entity' создала для меня методы get / set. Кажется, что всякий раз, когда я использую пространства имен, он автоматически создает классы внутри подпапок пространства имен, а затем я получаю ошибку «не может переопределить класс».

Может быть, я делаю что-то в корне неправильно ...

Спасибо за любую помощь!

ОБНОВЛЕНИЕ: Решение:

Возможно, я заработал, положив папку Entities рядом с папкой моих моделей. Если я изменю Entity ClassLoader на «APPPATH», а затем создаю экземпляры моих Entities с помощью «new Entities \ Blob», то это работает. Кажется, что нет никакой возможности поместить папку Entities в подпапку в папке models без каких-либо жалоб. Если кто-нибудь знает способ сделать это, мне было бы интересно услышать.

Ответы [ 2 ]

0 голосов
/ 09 июня 2014

Я работаю с сущностями и моделями в двух разных подпапках.Вот как я обработал:

структура моих файлов:

+ 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);

обратите внимание на "getRepository ('entity \ Formation')".Моя ошибка состояла в том, что я не указывал пространство имен "entity \" перед именем объекта.

0 голосов
/ 13 мая 2014

У меня такая же проблема. Это потому, что вы указываете подпапку в команде. Просто введите: "orm:generate-entities ." (без кавычек)

"." означает фактическую папку.

...