将类移动到文件系统后出现“Class XXX is not a valid entity or mapped super class”错误。该类不是有效的实体或映射的父类。

116

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

通过以下命令创建表单类没有问题:

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

现在我已将命名空间更改为Aib\PlatformBundle\Entity\Identity\User,但是当我尝试使用上述命令生成表单时, 它会显示以下错误信息:

"Class Aib\PlatformBundle\Entity\User is not a valid entity or mapped super class."

这是文件内容:

<?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的类,但忘记更新命名空间了? - Problematic
3
据我所知,无法为实体定义子命名空间,因为Symfony始终会尝试将AibPlatformBundle:User解析为Aim\PlatformBundle\Entity\User,而不考虑其命名空间。 - Alessandro Desantis
15个回答

270

我曾经遇到过这个问题 - 不要忘记添加以下注解* @ORM\Entity

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

17

昨天我遇到了这个问题,并找到了这个帖子。我在一个新包中创建了带映射的实体(例如,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: ~

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


干杯!我的配置(来自Sonata)只有映射:〜,没有指定任何捆绑包.. 手动添加它们解决了我的问题 :) - shousper

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

11

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

我花了一些时间在谷歌和源代码中挖掘才解决了这个问题。

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

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


9
感谢Mark Fu和mogoman的帮助。
我知道它一定在config.yml中......并且能够针对它进行测试。
app/console doctrine:mapping:info

真的很有帮助!

实际上,这个命令只是在出错时停止...没有反馈,但当一切正常时,你应该能够看到列出所有实体的列表。


9
在我的情况下,问题是通过将服务器缓存从 eAccelerator 更改为 APC 解决的。 显然,eAccelerator 会剥离文件中的所有注释,这会破坏您的注释。

1
Opcache有一个设置可以禁用注释剥离opcache.save_comments = 1,也许eAccelerator / APC也有这样的设置? - Oylex

3

我通过删除束资源目录下的冲突自动生成的orm.php文件解决了相同的异常;根据文档:“一个束只能接受一种元数据定义格式。例如,不能将YAML元数据定义与带注释的PHP实体类定义混合使用。”。


谢谢。你为我节省了很多时间。在创建一个以php格式的实体后,我遇到了这个错误,然后将其删除并创建了一个具有相同名称的新注释实体。 - iMx

1

我的错误在于我一直在做同一件事情。

$em->getRepository(EntityRepository::class)

替代

$em->getRepository(Entity::class)

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

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接