类XXX不是一个有效的实体或映射的超类;在文件系统中移动类之后


"Class XXX is not a valid entity or mapped super class" after moving the class in the filesystem

我在Aib'PlatformBundle' entity 'User.php中有一个实体类

通过

创建它的表单类没有任何问题

php app/console原则:generate:form AibPlatformBundle:User

现在我已经将名称空间更改为Aib'PlatformBundle'Entity'Identity'User,但是当我尝试使用我之前所说的任务生成表单时它说:

"Class 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

遇到这个问题-不要忘记下面的注释* @ORM'Entity:

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

昨天有这个问题,发现这个线程。我在一个新的bundle(例如MyFooBundle/entity/User.php)中创建了映射的实体,根据文档做了所有的配置,但在尝试加载应用程序时得到了相同的错误。

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

new My'FooBundle'MyFooBundle()

一个很好的调试方法是运行这个命令:

app/console doctrine:mapping:info

请检查配置。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: ~

将自己的bundle添加到映射列表中。

我通过在创建MetaDataConfiguration时设置$useSimpleAnnotationReader=false来解决这个问题。

我通过将false作为第二个参数传递给Doctrine'ORM'Configuration::newDefaultAnnotationDriver来解决这个问题。

我花了一些时间在Google和源代码中挖掘。

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

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

在我的情况下,问题是通过改变我的服务器缓存从eAcceleratorAPC来解决的。显然,eAccelerator会从文件中删除所有破坏注释的注释。

感谢傅宇森和莫歌曼

我知道它必须在config.yml的某个地方…并且能够对照

进行测试
app/console doctrine:mapping:info

真的帮助!

事实上,这个命令只是简单地停止在一个错误…没有反馈,但当一切都很好,你应该能够看到你所有的实体列出。

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

非常有可能你有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.');
}

古德勒克!

  1. 实体必须有适当的实体和表注释(顺序可能很重要,所以尝试两者)
  2. 如果有自定义存储库,它必须通过实体类本身访问($entityManager->getRepository('你的实体类名')),因为通过存储库类名调用它会欺骗Doctrine认为Repo类必须是一个实体本身。很傻,但是教条并没有做出硬性区分。

我的错误是我做了

$em->getRepository(EntityRepository::class)
不是

$em->getRepository(Entity::class)

在我的例子中,我在重构过程中太热心了,删除了一个doctrine yml文件!

在我的mac上,我使用src/MainBundle/Resource/Config/Doctrine,当然它在mac上工作,但它不能在生产Ubuntu服务器上工作。一旦将Config重命名为Config,将Doctrine重命名为Doctrine,就可以找到映射文件并开始工作。

在我的例子中,在制作make:entity之后,我尝试了以下命令

php bin/console doctrine:mapping:import "App'Entity" annotation --path=src/Entity哪个从数据库生成实体然而,这个命令不提供getter和setter,如果你在控制器中使用它,或者你以后会使用它,它们会导致未知的方法错误(例如getId)。所以我决定回到从

生成的实体。
php bin/console make:entity

所以我可以带回丢失的方法,但不幸的是,这导致我的错误类不是一个有效的实体或映射的超类。接下来,为了防止这个错误,我没有耐心阅读这个文档

[1]: https://www.doctrine-project.org/projects/doctrine-orm/en/2.11/tutorials/override-field-association-mappings-in-subclasses.html#override-field-association-mappings-in-subclasses特别是我在注释的地方使用属性,因此,我带回了生成的实体,只是添加了以下命令,生成getter和setter $ php bin/console make:entity --regenerate App挽救了我的生命,虽然这解决了我的问题,但我没有弄清楚为什么在第一种情况下,它导致了我这个主题的错误

我摆脱了相同的错误信息,因为在你的情况下使用app/console_dev而不仅仅是app/console