导入注释的问题

新手上路,请多包涵

我正在开发一个 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 ,但我必须为我的实体(表、列、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 都可以使用的解决方案。有任何想法吗?

原文由 Steven Mercatante 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 527
2 个回答

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

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

原文由 user1825294 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

}

原文由 ajtrichards 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏