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


93

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

У мене не було проблем при спробі створити клас його форми

доктрина додатка / консолі php: create: 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) просто мав відображення: ~, не вказуючи жодних пучків .. Додавання їх вручну виправило мою проблему :)
shousper

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

великий thx до Марка Фу та могомана

Я знав, що це повинно бути десь у config.yml ... і можливість перевірити його на

app/console doctrine:mapping:info

справді допомогло!

Насправді ця команда просто зупиняється на помилці ... зворотного зв’язку немає, але коли все в порядку, ви зможете побачити всі свої сутності в списку.


3

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


Дякую. Ви заощадили мені багато часу. Отримав цю помилку після створення сутності у форматі php, після чого видалив її та створив нову анотовану сутність з тим самим іменем.
iMx

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.