Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.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

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
Php 原则2:如何解决;“目标实体”;“和可接合的”;名称“;动态特征?_Php_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php 原则2:如何解决;“目标实体”;“和可接合的”;名称“;动态特征?

Php 原则2:如何解决;“目标实体”;“和可接合的”;名称“;动态特征?,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我想创建一个实体,它将实现以下接口 <?php namespace App\Entity\Interfaces; #... interface FooInterface { /** * @param ArrayCollection|FooInterface[] $foo */ public function setFoo($foo); /** * @return ArrayCollection|FooInterface[]

我想创建一个实体,它将实现以下接口

<?php

namespace App\Entity\Interfaces;
#...

interface FooInterface
{
    /**
     * @param ArrayCollection|FooInterface[] $foo
     */
    public function setFoo($foo);

    /**
     * @return ArrayCollection|FooInterface[]
     */
    public function getFoo();
}

我选择的方法好吗?如果是这样的话,我该如何解决我的问题呢?

我以前做过,这很有趣,也有点复杂,但给了你的应用大量的灵活性。您正在尝试的是动态关系映射

详细教程如下所示。我建议你去看看。我将在这里总结这些步骤:

  • 首先,需要清空要动态映射的关系的ORM注释字段。您不能对注释执行此操作

  • 其次,您需要创建一个事件订阅者/监听器,监听事件

  • 然后,您只需要侦听实现所需接口的实体。您将在事件中收到一个
    ClassMetadata
    实例,其中包含内存中实体的
    ReflectionClass
    ,以及一系列有用的方法,用于检查是否实现了给定的接口,等等,例如:

  • $metadata=$eventArgs->getMetadata();
    如果(!array_key_)存在(FooInterface::class,
    $metadata->getReflectionClass()->getInterfaces()){
    返回;
    }
    
  • 根据您的需要,您必须调用
    $metadata->mapManyToMany()
    ->mapManyToOne()
    ->mapOneToMany()
    等。它以一个复杂且定义良好的数组作为参数,该数组包含的信息与您在注释中输入的信息几乎相同。您可以将其中大部分保留为空以使用默认值。需要提供的是
    targetEntity
    字段名
    (即实体类中属性的名称)

  • 保存它并将侦听器注册为服务。您可以使用条令控制台命令调试步骤4的阵列配置,该命令将打印出它将生成的SQL查询

  • 旁注:这不是一个昂贵的操作,因为classMetadata是由doctrine缓存的

    <?php
    
    namespace App\Entity\Entity;
    #...
    
    class Bar implements FooInterface
    {
        use FooTrait;
    }
    
    <?php
    
    namespace App\Entity\Entity;
    #...
    
    class Baz implements FooInterface
    {
        use FooTrait;
    }
    
    <?php
    
    namespace App\Entity\Traits;
    #...
    
    trait FooTrait
    {
        /**
         * Many Foo has Many Foo.
         *
         * @ORM\ManyToMany(targetEntity="...")
         * @ORM\JoinTable(
         *     name="..."
         *     joinColumns={@ORM\JoinColumn(name="foo_id", referencedColumnName="id")},
         *     inverseJoinColumns={@ORM\JoinColumn(name="foo_of_id", referencedColumnName="id")}
         * )
         * @ORM\OrderBy({"id" = "ASC"})
         *
         * @var FooInterface[]|ArrayCollection
         */
        protected $foo;
    
        #...
    }