【发布时间】:2012-08-08 06:09:18
【问题描述】:
我正在开发一个 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 都可以使用的解决方案。有什么想法吗?
【问题讨论】:
标签: php doctrine-orm