«Класс XXX не является допустимым объектом или сопоставленным суперклассом» после перемещения класса в файловой системе

60

У меня был класс сущностей в Aib\PlatformBundle\Entity\User.php

У меня не было проблем с попыткой создать класс формы через

php app/console doctrine: generate: form AibPlatformBundle: Пользователь

Теперь я изменил пространство имен на Aib\PlatformBundle\Entity\Identity\User, но когда я попытаюсь сгенерировать форму с заданием, которое я сказал ранее он говорит:

"Класс Aib\PlatformBundle\Entity\User не является допустимым сущностью или сопоставлен суперкласс".

Это содержимое файла:

<?php
namespace Aib\PlatformBundle\Entity\Identity;

use Doctrine\ORM\Mapping as ORM;

    /**
     * Aib\PlatformBundle\Entity\Identity\User
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Aib\PlatformBundle\Entity\Identity
    \UserRepository")
     */
    class User
    {
    ...

Любая идея?

symfony2.0.4

  • 0
    Есть ли у вас классы, расширяющие User, для которых вы забыли обновить пространства имен?
  • 3
    Насколько я знаю, невозможно определить подпространства имен для ваших сущностей, поскольку Symfony всегда будет пытаться разрешить AibPlatformBundle: User в Aim \ PlatformBundle \ Entity \ User , независимо от его пространства имен.
Теги:
doctrine2

10 ответов

164

Если бы эта проблема - не забывайте аннотацию * @ORM\Entity, как показано ниже:

/**
 * Powma\ServiceBundle\Entity\User
 *
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
  • 6
    Спасибо! :) сэкономил мне много времени!
  • 0
    Я не могу поверить, что это так далеко внизу! Я не могу поверить, что со мной тоже произошла ошибка, но хорошо !! Спасибо!
Показать ещё 3 комментария
13

У этой проблемы вчера была и эта тема. Я создал объект с отображением в новом пакете (например, MyFooBundle/Entity/User.php), выполнил всю конфигурацию в соответствии с документами, но получил ту же самую ошибку при попытке загрузить приложение.

В конце я понял, что я не загружал MyFooBundle в AppKernel:

new My\FooBundle\MyFooBundle()

Отличный способ отладки - запустить эту команду:

app/console doctrine:mapping:info
  • 1
    Ах, блин, это часто самые простые вещи, которые мы забываем ... большое спасибо: D
13

Проверьте файл config.yml, должен содержать следующее:

# Doctrine Configuration
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
        types:
            json: Sonata\Doctrine\Types\JsonType

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        # auto_mapping: true
        entity_managers:
            default:
                mappings:
                    FOSUserBundle: ~
                    # ApplicationSonataUserBundle: ~
                    YourUserBundle: ~
                    SonataUserBundle: ~

Добавьте свой собственный пакет в список сопоставлений.

  • 0
    Ура !! Мой конфиг (из Сонаты) только что имел сопоставления: ~, без указания каких-либо пакетов .. Добавление их вручную решило мою проблему :)
7

В моем случае проблема была решена путем изменения кеша серверов от eAccelerator до APC. Очевидно, eAccelerator удаляет все комментарии из файлов, которые разбивают ваши аннотации.

  • 0
    В Opcache есть настройка для отключения удаления комментариев opcache.save_comments=1 , может быть, есть и для eAccelerator / APC?
5

big спасибо Марку Фу и магоману

Я знал, что это должно быть где-то в config.yml... и быть в состоянии проверить его на

app/console doctrine:mapping:info

действительно помог!

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

3

Я решил это, передав false в качестве второго параметра Doctrine\ORM\Configuration::newDefaultAnnotationDriver.

Мне потребовалось некоторое время, чтобы перекопать через Google и исходный код.

Мой случай был особенным, поскольку я использовал сопоставление, указывающее на другой каталог, не имеющий отношения к установке Symfony, поскольку мне также пришлось использовать устаревший код.

Я переработал устаревшие объекты, и они перестали работать. Раньше они использовали @Annotation вместо @ORM\Annotation, поэтому после рефакторинга просто не удалось прочитать метаданные. Не используя простой читатель аннотаций, все выглядит нормально.

3

Я разрешил одно и то же исключение, удалив конфликтный автогенерированный файл orm.php в папке Resources/config/doctrine; в соответствии с документацией: "Пакет может принимать только один формат определения метаданных. Например, невозможно сопоставить определения метаданных YAML с аннотированными определениями сущности класса PHP".

  • 0
    Спасибо. Вы сэкономили мне много времени. Получил эту ошибку после создания php-объекта Entity, затем удалил его и создал новый аннотированный объект с тем же именем.
2

Я решил эту проблему, установив $useSimpleAnnotationReader=false при создании MetaDataConfiguration.

1

Очень высокая вероятность того, что у вас PHP 5.3.16 (Symfony 2.x не будет работать с ним). В любом случае вы должны загрузить страницу проверки http://you.site.name/config.php Если проект не работал на сервере хостинга, следующие строки должны быть удалены в "config.php":

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
    '127.0.0.1',
    '::1',
))) {
    header('HTTP/1.0 403 Forbidden');
    exit('This script is only accessible from localhost.');
}

Гудлак!

-2

Я избавился от того же сообщения об ошибке, что и в вашем случае, используя app/console_dev, а не только приложение/консоль

Ещё вопросы

Сообщество Overcoder
Наверх
Меню