导入批注时出现问题



我正在做一个CodeIgniter项目,其中我使用了Doctrine2和Symfony2 Validator组件。

我所有的 Doctrine2 实体都use DoctrineORMMapping,实体经理会识别它们。我的实体注释如下所示:

/**
 * @Entity(repositoryClass = "UserRepository")
 * @Table(name = "user")
 * @HasLifecycleCallbacks()
 */

此时,我能够毫无困难地保留实体。当我尝试使用Symfony2验证器组件时,出现了第一个问题。当我尝试验证User对象时,出现此错误:

[语义错误] 从未导入类 Entity\User 中的注释"@Entity"。您是否忘记为此注释添加"use"语句?

这个问题的唯一"修复"是通过 use DoctrineMappingEntity ,但我必须为我的实体使用的每个注释(表、列、ManyToOne 等)执行此操作。我试图弄清楚为什么我需要明确use每个注释类而不是自动识别它们(use DoctrineORMMapping不应该授予我访问该命名空间中所有类的权限吗?

因此,我随后尝试use DoctrineORMMapping as ORM并在所有注释前面加上ORM。例如:@ORMEntity() .Symfony2验证器停止抱怨,但现在Doctrine2抱怨说Class EntityUser is not a valid entity or mapped super class.我不知道为什么这种方法适用于验证器,而不是Doctrine2。如果我运行控制台命令doctrine:orm:info,则无法识别我的User实体。

因为这是一个CodeIgniter应用程序,所以我会自动加载Symfony2和Doctrine2库。我的自动加载代码如下:

# Symfony2 ClassLoader component
require_once __DIR__ . '/application/libraries/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
$loader = new SymfonyComponentClassLoaderUniversalClassLoader();
$loader->register();
$loader->registerNamespace('Symfony', __DIR__ . '/application/libraries/symfony/src');
$loader->registerNamespace('Doctrine', __DIR__ . '/application/libraries/doctrine/lib');
# Doctrine2 
require_once __DIR__ . '/application/libraries/doctrine/lib/Doctrine/Common/Annotations/AnnotationRegistry.php';
use DoctrineCommonAnnotationsAnnotationRegistry;
AnnotationRegistry::registerLoader(function($class) use ($loader) {
    $loader->loadClass($class);
    $classExists = class_exists($class, false);
    return $classExists;
});
AnnotationRegistry::registerFile(__DIR__ . '/application/libraries/doctrine/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');

我不在乎我是否必须在所有内容前面加上ORM,我只想找到一个Symfony2验证器和Doctrine2都可以使用的解决方案。有什么想法吗?

我在使用 Silex、Doctrine2 和 Symfony-Validator 时遇到了类似的问题。

解决方案是避免使用SimpleAnnotationsReader,而是使用普通的AnnotationReader(看看Doctrine\ORM\Configuration::newDefaultAnnotationDriver)。然后,您可以在每个实体前面加上ORM(当然,在每个实体中插入use DoctrineORMMapping as ORM;)。

我通过将以下内容添加到我的实体文件来解决此问题:

use DoctrineORMMapping as ORM;

所以我的文件现在看起来像:

<?php
namespace AcmeCustomBundleEntity;
use DoctrineORMMapping as ORM;
/**
 * Example
 *
 * @ORMEntity
 * @ORMTable(name="example")
 *
 */
class Example
{
    /**
     * @ORMColumn(type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     *
     * @var integer
     */
    private $id;
    /**
     * @ORMColumn(type="string", length=125)
     *
     * @var string
     */
    private $title;
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set title
     *
     * @param string $title
     *
     * @return Example
     */
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }
    /**
     * Get title
     *
     * @return string
     */
    public function gettitle()
    {
        return $this->title;
    }
}

添加 use 语句 您在entities中使用的每个注释。例如:

use DoctrineORMMappingEntity;
use DoctrineORMMappingTable;
use DoctrineORMMappingId;
use DoctrineORMMappingColumn;
use DoctrineORMMappingGeneratedValue;

但是您可能对使用此方法不感兴趣。您可以将所有use语句写入一个文件,并将其包含在entities中。

在 ubuntu 更新期间 php7 升级到 php8 时遇到了同样的问题。我不想将所有的项目依赖项更新为 php8,所以我安装了 ondrej/php ppa 并在 php8 之外重新安装了 php7。

我收到相同的错误消息"[语义错误] 类实体\用户中的注释"@Entity"从未导入。您是否忘记为此注释添加"使用"语句?

问题是我有ORM的别名,并且没有将其用于注释。

我有这个:@OneToOne(targetEntity="CompanyProduct")

正确的是:@ORMOneToOne(targetEntity="CompanyProduct")

如果您正在测试并且测试因此而失败。确保在 phpunit 设置中配置了正确的自动加载。

对于非常具体的情况,我的问题是升级我的symfony版本,而在我拥有bootstrap.cache.php文件之前,但是在新版本上,它是app/autoload。我必须更改我的phpunit.xml配置文件并将我的引导选项设置为该文件bootstrap="autoload.php"

我的问题通过添加解决了:

use DoctrineORMMappingHasLifecycleCallbacks;

丑陋的解决方案

正在学习教义,在这个阶段对我来说重要的是,我可以轻松地从网站上复制/粘贴示例并使用它们而无需额外的编辑。

  • 为所有实体设置如下所示的命名空间:namespace DoctrineORMMapping;

相关内容

  • 没有找到相关文章

最新更新