Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 解析目标实体编译器传递_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 解析目标实体编译器传递

Symfony 解析目标实体编译器传递,symfony,doctrine-orm,Symfony,Doctrine Orm,我试图创建一个bundle,它根据参数值设置一些解析目标实体。我在互联网上发现了类似的问题,但那里的答案似乎不适合我。也许我错过了什么。请检查我哪里出错了 以下是bundle类中的生成方法: public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new ResolveTargetEntitiesCompilerPa

我试图创建一个bundle,它根据参数值设置一些解析目标实体。我在互联网上发现了类似的问题,但那里的答案似乎不适合我。也许我错过了什么。请检查我哪里出错了

以下是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()
    ));
}
据我所知,这是我所需要的一切,但我得到的消息类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
实体。