我试图创建一个基于参数值设置一些解析目标实体的包。我在互联网上发现了类似的问题,但似乎答案对我不起作用。也许我错过了什么。请检查我出错的地方!
这是bundle类中的构建方法:
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()
));
}
据我所知,我需要的只是我需要的东西,但是我得到了Doctrine \ Common \ Persistence \ Mapping \ MappingException,邮件类Test \ BaseBundle \ Entity \ ContentType不存在。
编辑:
在这种情况下,ContentType是一个接口。这是我作为test_base.content_type_entity_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_base.content_type_entity_class参数的值设置为Test \ BaseExampleBundle \ Entity \ ContentType。
编辑:
当我在doctrine.orm.resolve_target_entities配置键中放入至少一个条目时,我发现它正在工作。
答案 0 :(得分:0)
我找到了解决方案。它在Doctrine\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension::ormLoad
函数中。它根据教义版本将doctrine.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');
}
所以我的解决方案是在我的编译器传递中执行相同的操作:
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');
}