12

我正在使用 Doctrine2 和 Symfony2 Validator 组件的 CodeIgniter 项目。

我所有的 Doctrine2 实体use Doctrine\ORM\Mapping和实体管理器都能识别它们。我的实体注释如下所示:

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

在这一点上,我可以毫无问题地持久化实体。第一个问题出现在我尝试使用 Symfony2 Validator 组件时。当我尝试验证User对象时,我收到此错误:

[语义错误] Entity\User 类中的注释“@Entity”从未被导入。您是否可能忘记为此注释添加“使用”语句?

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

因此,我尝试在use Doctrine\ORM\Mapping as ORM所有注释前加上ORM\. 例如:@ORM\Entity()。Symfony2 验证器停止抱怨,但现在 Doctrine2 抱怨Class Entity\User 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 \Symfony\Component\ClassLoader\UniversalClassLoader();
$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 Doctrine\Common\Annotations\AnnotationRegistry;
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 Validator 和 Doctrine2 都可以使用的解决方案。有任何想法吗?

4

8 回答 8

24

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

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

于 2012-11-15T00:06:28.727 回答
14

我通过将以下内容添加到我的实体文件中解决了这个问题:

use Doctrine\ORM\Mapping as ORM;

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

<?php

namespace Acme\CustomBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Example
 *
 * @ORM\Entity
 * @ORM\Table(name="example")
 *
 */
class Example
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @var integer
     */
    private $id;

    /**
     * @ORM\Column(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;
    }

}
于 2015-11-24T11:08:07.590 回答
5

为您useentities. 例如:

use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Table;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\GeneratedValue;

但是您可能对使用这种方法不感兴趣。您可以将所有use语句写入一个文件,然后将其包含在您的entities.

于 2015-02-04T11:50:04.983 回答
1

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

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

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

正确的是:@ORM\OneToOne(targetEntity="CompanyProduct")

于 2018-08-04T07:19:22.307 回答
0

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

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

于 2017-12-11T10:06:29.613 回答
0

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

use Doctrine\ORM\Mapping\HasLifecycleCallbacks;

于 2019-05-11T19:21:23.143 回答
0

丑陋的解决方案

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

  • 为所有实体设置这样的命名空间:namespace Doctrine\ORM\Mapping;
于 2021-02-05T17:54:17.153 回答
0

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

于 2022-03-04T16:44:49.203 回答