在文件系统中移动类后,“类XXX不是有效实体或映射的超类”


91

我在Aib \ PlatformBundle \ Entity \ User.php中有一个实体类

我通过尝试创建其表单类没有问题

PHP应用程序/控制台原则:生成:表单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


您是否有任何扩展User的类却忘记为其更新名称空间?
有问题的

3
据我所知,不可能为您的实体定义子命名空间,因为Symfony将始终尝试将AibPlatformBundle:User解析为Aim \ PlatformBundle \ Entity \ User,无论其命名空间如何。
亚历山德罗·迪桑蒂斯

Answers:


227

遇到了这个问题-不要忘记* @ORM\Entity如下所示的注释:

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

15

昨天有这个问题,找到了这个线程。我在新的捆绑包中创建了带有映射的实体(例如MyFooBundle / Entity / User.php),根据文档进行了所有配置,但是在尝试加载应用程序时从上面得到了相同的错误。

最后,我意识到我没有在AppKernel中加载MyFooBundle:

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 2012年

10

我通过将false第二个参数传递给Doctrine\ORM\Configuration::newDefaultAnnotationDriver

我花了一些时间浏览Google和源代码。

我的情况有点特殊,因为我使用的是指向另一个与Symfony安装无关的目录的映射,因为我还必须使用旧代码。

我重构了旧实体,他们停止工作了。他们曾经使用@Annotation而不是@ORM\Annotation,因此在重构之后,它根本无法读取元数据。通过不使用简单的注释阅读器,一切似乎都可以了。


8

就我而言,问题是通过将服务器缓存从eAccelerator更改为APC来解决的。显然,eAccelerator会删除文件中的所有注释,这会破坏注释。


Opcache具有一项禁用注释剥离的设置opcache.save_comments=1,也许eAccelerator / APC也有一个?
Oylex

8

我通过$useSimpleAnnotationReader=false在创建时进行设置解决了此问题MetaDataConfiguration


7

马克·福和莫高曼

我知道它必须在config.yml中的某处...并能够针对

app/console doctrine:mapping:info

真的有帮助!

实际上,此命令只是在出错时停止...没有反馈,但是当一切都很好时,您应该能够看到列出的所有实体。


3

我通过删除捆绑包的Res​​ources / config / doctrine文件夹中有冲突的自动生成的orm.php文件解决了相同的异常;根据文档所述:“捆绑包只能接受一种元数据定义格式。例如,不可能将YAML元数据定义与带注释的PHP实体类定义混合使用。”


谢谢。你节省了我很多时间。创建php格式的实体后出现此错误,然后删除该错误并创建了一个具有相同名称的新带注释的实体。
iMx 2014年

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,我摆脱了与您的情况相同的错误消息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.