我正在开发一个CodeIgniter项目,我正在使用Doctrine2和Symfony2 Validator组件.
我的所有Doctrine2实体use Doctrine\ORM\Mapping和实体管理器都会识别它们.我的实体注释看起来像这样:
/**
* @Entity(repositoryClass = "UserRepository")
* @Table(name = "user")
* @HasLifecycleCallbacks()
*/
Run Code Online (Sandbox Code Playgroud)
此时,我能够毫无困难地坚持实体.当我尝试使用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');
Run Code Online (Sandbox Code Playgroud)
我不在乎我是否必须为所有内容做准备ORM\,我只是想找到一个Symfony2 Validator和Doctrine2都可以使用的解决方案.有任何想法吗?
use*_*294 20
使用Silex,Doctrine2和Symfony-Validator时,我遇到了类似的问题.
解决方案是避免使用SimpleAnnotationsReader,而是使用普通的AnnotationReader(查看Doctrine\ORM\Configuration :: newDefaultAnnotationDriver).然后,您可以为每个实体添加前缀ORM\(当然也可以插入use Doctrine\ORM\Mapping as ORM;每个实体).
我通过将以下内容添加到我的实体文件中解决了这个问题:
use Doctrine\ORM\Mapping as ORM;
Run Code Online (Sandbox Code Playgroud)
所以我的文件现在看起来像:
<?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;
}
}
Run Code Online (Sandbox Code Playgroud)
为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;
Run Code Online (Sandbox Code Playgroud)
但您可能对使用此方法不感兴趣。您可以将所有use语句写入一个文件,然后将其包含在您的entities.
| 归档时间: |
|
| 查看次数: |
25915 次 |
| 最近记录: |