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


93

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

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

php app / console doctrine: generate: form AibPlatformBundle: User

Теперь я изменил пространство имен на 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


У вас есть классы, расширяющие User, для которых вы забыли обновить пространства имен?
Проблемная

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

Ответы:


228

Была эта проблема - не забудьте аннотацию, * @ORM\Entityкак показано ниже:

/**
 * Powma\ServiceBundle\Entity\User
 *
 * @ORM\Entity
 * @ORM\Table(name="users")
 */

16

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

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

new My\FooBundle\MyFooBundle()

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

app/console doctrine:mapping:info

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: ~

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


Ура !! В моей конфигурации (из Sonata) только что были сопоставления: ~, без указания каких-либо пакетов .. Добавление их вручную
устранило

10

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

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

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

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


9

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


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

9

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


7

Большое спасибо Марку Фу и могоману

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

app/console doctrine:mapping:info

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

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


3

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


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

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.');
}

Удачи!


0

В моем случае я слишком усердствовал во время рефакторинга и удалил файл доктрины yml!


0

В моем случае на моем Mac я использовал src / MainBundle / Resource / Config / Doctrine, конечно, он работал на Mac, но не работал на производственном сервере Ubuntu. После переименования Config в config и Doctrine в doctrine файлы сопоставления были найдены, и он начал работать.


-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.