解析目标实体编译器传递

时间:2016-01-16 18:44:53

标签: symfony doctrine-orm

我试图创建一个基于参数值设置一些解析目标实体的包。我在互联网上发现了类似的问题,但似乎答案对我不起作用。也许我错过了什么。请检查我出错的地方!

这是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配置键中放入至少一个条目时,我发现它正在工作。

1 个答案:

答案 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');
    }