Symfony 解析目标实体编译器传递
我试图创建一个bundle,它根据参数值设置一些解析目标实体。我在互联网上发现了类似的问题,但那里的答案似乎不适合我。也许我错过了什么。请检查我哪里出错了 以下是bundle类中的生成方法:Symfony 解析目标实体编译器传递,symfony,doctrine-orm,Symfony,Doctrine Orm,我试图创建一个bundle,它根据参数值设置一些解析目标实体。我在互联网上发现了类似的问题,但那里的答案似乎不适合我。也许我错过了什么。请检查我哪里出错了 以下是bundle类中的生成方法: public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new ResolveTargetEntitiesCompilerPa
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ResolveTargetEntitiesCompilerPass());
}
下面是编译器过程中的处理方法:
public function process(ContainerBuilder $container)
{
$def = $container->findDefinition('doctrine.orm.listeners.resolve_target_entity');
$def->addMethodCall('addResolveTargetEntity', array(
'Test\BaseBundle\Entity\ContentType', $container->getParameter('test_base.content_type_entity_class'), array()
));
$def->addMethodCall('addResolveTargetEntity', array(
'Test\BaseBundle\Entity\Path', $container->getParameter('test_base.path_entity_class'), array()
));
}
据我所知,这是我所需要的一切,但我得到的消息类Test\BaseBundle\Entity\ContentType的条令\Common\Persistence\Mapping\MappingException不存在
编辑:
在本例中,ContentType是一个接口。下面是我作为test\u base.content\u type\u entity\u class参数通过的类:
namespace Test\BaseExampleBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Test\BaseBundle\Entity\ContentType as ContentTypeInterface;
/**
* ContentType
*
* @ORM\Table()
* @ORM\Entity
*/
class ContentType implements ContentTypeInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="action", type="string", length=255)
*/
private $action;
/**
* @var string
*
* @ORM\Column(name="codename", type="string", length=255)
*/
private $codename;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @inheritdoc
*/
public function setAction($action)
{
$this->action = $action;
return $this;
}
/**
* @inheritdoc
*/
public function getAction()
{
return $this->action;
}
/**
* @inheritdoc
*/
public function getCodename()
{
return $this->codename;
}
/**
* @inheritdoc
*/
public function setCodename($codename)
{
$this->codename = $codename;
return $this;
}
}
只是为了明确test\u base.content\u type\u entity\u类参数的值设置为test\BaseExampleBundle\entity\ContentType
编辑:
当我在doctor.orm.resolve\u target\u entities配置键中至少输入一个条目时,我发现它正在工作。我找到了解决方案。它位于
Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension::ormLoad
函数中。它将条令.orm.listeners.resolve_target_entity
服务定义标记为基于条令版本的侦听器或订阅者
// BC: ResolveTargetEntityListener implements the subscriber interface since
// v2.5.0-beta1 (Commit 437f812)
if (version_compare(Version::VERSION, '2.5.0-DEV') < 0) {
$def->addTag('doctrine.event_listener', array('event' => 'loadClassMetadata'));
} else {
$def->addTag('doctrine.event_subscriber');
}
//BC:ResolveTargetEntityListener自
//v2.5.0-beta1(提交437f812)
if(version_compare(version::version,'2.5.0-DEV')<0){
$def->addTag('doctrine.event_listener',数组('event'=>'loadClassMetadata');
}否则{
$def->addTag('doctrine.event_subscriber');
}
因此,我的解决方案是在编译器过程中执行相同的操作,如下所示:
if (version_compare(Version::VERSION, '2.5.0-DEV') < 0 && !$def->hasTag('doctrine.event_listener')) {
$def->addTag('doctrine.event_listener', array('event' => 'loadClassMetadata'));
} elseif(!$def->hasTag('doctrine.event_subscriber')) {
$def->addTag('doctrine.event_subscriber');
}
if(version\u compare(version::version,'2.5.0-DEV')<0&!$def->hasTag('doctrine.event\u listener')){
$def->addTag('doctrine.event_listener',数组('event'=>'loadClassMetadata');
}elseif(!$def->hasTag('doctrine.event_subscriber')){
$def->addTag('doctrine.event_subscriber');
}
您检查过实体的名称空间了吗?是的,我绝对确定名称空间是匹配的。自动加载程序是否知道该类(即,当您像应用程序中的任何其他类一样使用它时是否会找到该类)?如果不确定,可以显示包含类的文件的内容、您的composer.json
文件以及存储类的位置。顺便说一句,您知道不需要创建这样的编译器过程,但您可以?尝试使用'TestBaseBundle:ContentType'
而不是'Test\BaseBundle\Entity\ContentType'
完整的命名空间应该可以工作。请在问题中添加带有命名空间和映射的ContentType
实体。