导入注释时遇到问题

时间:2012-08-10 22:40:30

标签: php doctrine-orm

我正在开发一个CodeIgniter项目,我正在使用Doctrine2和Symfony2 Validator组件。

我的所有Doctrine2实体use Doctrine\ORM\Mapping和实体管理器都会识别它们。我的实体注释看起来像这样:

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

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

  

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

此问题的唯一“修复”是通过use Doctrine\Mapping\Entity,但我必须为我的实体使用的每个注释执行此操作(Table,Column,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.我不知道为什么这个方法适用于Validator,而不是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都可以使用的解决方案。有什么想法吗?

7 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:8)

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

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;
    }

}

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我收到相同的错误消息“ [语义错误]从来没有导入Entity \ User类中的注释“ @Entity”。您可能忘了为此注释添加“ use”语句吗?“。

问题是我有ORM的别名,但未将其用于注释。

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

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

答案 5 :(得分:0)

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

use Doctrine\ORM\Mapping\HasLifecycleCallbacks;

答案 6 :(得分:0)

丑陋的解决方案

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

  • 像这样为所有实体设置命名空间:namespace Doctrine\ORM\Mapping;