Доктрина Symfony 2.1 в недавно созданных пакетах

Интересно, сталкивался ли кто-нибудь еще с этой проблемой. Таким образом, мы обновились с Symfony 2.0 до Symfony 2.1. В Symfony 2.1, если создать новый пакет, а затем объект для использования с Doctrine, я получаю "not a valid entity or mapped super class". Если я помещу тот же самый класс сущности (с правильными изменениями пути) в существующий пакет (созданный до версии 2.1), к нему можно будет получить доступ без проблем, даже из нового пакета.

Вот шаги.

$ php app/console generate:bundle --namespace="Core/TestBundle"--format=yml --no-interaction --structure=no --dir=src 
$ php app/console doctrine:generate:entity --entity="CoreTestBundle:Product" --fields="name:string(255) price:float description:text" 

вот полученный код Product.php

<?php

namespace Core\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Core\TestBundle\Entity\Product
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Product
{
/**
 * @var integer $id
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string $name
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var float $price
 *
 * @ORM\Column(name="price", type="float")
 */
private $price;

/**
 * @var text $description
 *
 * @ORM\Column(name="description", type="text")
 */
private $description;


/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 * @return Product
 */
public function setName($name)
{
    $this->name = $name;
    return $this;
}

/**
 * Get name
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Set price
 *
 * @param float $price
 * @return Product
 */
public function setPrice($price)
{
    $this->price = $price;
    return $this;
}

/**
 * Get price
 *
 * @return float
 */
public function getPrice()
{
    return $this->price;
}

/**
 * Set description
 *
 * @param text $description
 * @return Product
 */
public function setDescription($description)
{
    $this->description = $description;
    return $this;
}

/**
 * Get description
 *
 * @return text
 */
public function getDescription()
{
    return $this->description;
}
}

отсюда бегу

$ php app/console doctrine:generate:entities "Core/TestBundle/Entity/Product" 

или доступ к Продукту из кода приводит к
[Doctrine\ORM\Mapping\MappingException] Class Core\TestBundle\Entity\Product is not a valid entity or mapped super class.работе
$ php app/console doctrine:schema:update --force выдает "Нечего обновлять"

С другой стороны, если я использую уже существующий пакет, такой как ArticleBundle, и запускаю те же команды, т.е.

$ php app/console doctrine:generate:entity --entity="CoreArticleBundle:Product" --fields="name:string(255) price:float description:text"
$ php app/console doctrine:generate:entities "Core/ArticleBundle/Entity/Product"
$ php app/console doctrine:schema:update --force 

отлично создает таблицу. Кроме того, доступ к продукту из TestBundle как CoreArticleBundle:Product работает нормально. Я пытался сравнить конфигурации пакетов и т. д., но ничего не смог придумать.

Я также запускаю сценарии создания БД следующим образом.

$ php app/console doctrine:database:drop --force 

Удалена база данных для соединения с именем dev

$ php app/console doctrine:database:create 

Создана база данных для подключения с именем dev Все таблицы созданы, кроме таблицы Product.

Кроме того, я создал фикстуру с объектом Product. То же самое. Работает в существующем комплекте. Та же ошибка, что и выше, во вновь созданном пакете.


person Victor    schedule 04.09.2012    source источник
comment
Это нормально, что вы получаете сообщение об ошибке, если не запускаете схему: обновление. Странно то, что schema:update ничего не обновляет. Вы проверили, что сущность действительно создана и выглядит нормально? Вы пробовали запустить доктрину: схема: создать? Что это отсюда бежит?   -  person Carlos Granados    schedule 04.09.2012
comment
Можете ли вы вставить код сгенерированного объекта Product сразу после доктрины php app/console: generate:entity --entity=CoreTestBundle:Product --fields=name:string(255) price:float description:text ?   -  person Sybio    schedule 04.09.2012
comment
Отсюда бег должен означать, что следующий шаг ...   -  person Victor    schedule 04.09.2012
comment
Вы пробовали запустить доктрину: схема: создать?   -  person Carlos Granados    schedule 04.09.2012
comment
php app/console doctrine:database:create Не удалось создать базу данных для соединения с именем ‹comment›dev‹/comment› SQLSTATE [HY000]: общая ошибка: 1007 Невозможно создать базу данных 'dev'; база данных существует. Я могу попробовать сбросить и создать БД?   -  person Victor    schedule 04.09.2012
comment
php app/console doctrine:database:drop --force Отброшена база данных для подключения с именем ‹comment›dev‹/comment› php app/console doctrine:database:create Создана база данных для подключения с именем ‹comment›dev‹/comment›. Еще не таблица продуктов.   -  person Victor    schedule 04.09.2012


Ответы (2)


Поговорил с местным экспертом. Оказывается, наше приложение использует два менеджера ORM. В таком случае каждый бандл, использующий ORM, должен быть зарегистрирован в app/config/config.yml. то есть

entity_managers:
        sql_write:
            connection: sql_write
            mappings:
                CoreUserBundle : ~
                CoreImageBundle : ~
                CoreTestBundle : ~
person Victor    schedule 10.09.2012

Учение: схема: проверка должно помочь вам найти ошибки... Он проверит ваше сопоставление и проверит, синхронизировано ли сопоставление с базой данных.

person Gmajoulet    schedule 05.09.2012
comment
$ php app/console doctrine:schema:validate [InvalidArgumentException] Command "doctrine:schema:validate" is not defined. Что-то не установлено в моем пакете Symfony? - person Victor; 05.09.2012
comment
Установите или обновите своих поставщиков снова... Вы используете Composer, теперь вы обновили свою версию sf2? - person Gmajoulet; 05.09.2012
comment
Наконец-то обновил Doctrine и смог запустить `php app/console doctrine:schema:validate'. Он жаловался на некоторые другие файлы, но не на Product. Объект Product кажется невидимым для Doctrine. Есть ли способ заставить его? - person Victor; 07.09.2012
comment
Проверьте синтаксис аннотаций, Doctrine должна увидеть вашу сущность. - person Gmajoulet; 07.09.2012
comment
Дважды проверил аннотации. В любом случае точно такой же код распознается в ArticeBundle (созданном до версии 2.1), но не в TestBundle, созданном после версии 2.1. - person Victor; 07.09.2012