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();
}
我选择的方法好吗?如果是这样的话,我该如何解决我的问题呢?我以前做过,这很有趣,也有点复杂,但给了你的应用大量的灵活性。您正在尝试的是动态关系映射 详细教程如下所示。我建议你去看看。我将在这里总结这些步骤:
ClassMetadata
实例,其中包含内存中实体的ReflectionClass
,以及一系列有用的方法,用于检查是否实现了给定的接口,等等,例如:$metadata=$eventArgs->getMetadata();
如果(!array_key_)存在(FooInterface::class,
$metadata->getReflectionClass()->getInterfaces()){
返回;
}
$metadata->mapManyToMany()
,->mapManyToOne()
,->mapOneToMany()
等。它以一个复杂且定义良好的数组作为参数,该数组包含的信息与您在注释中输入的信息几乎相同。您可以将其中大部分保留为空以使用默认值。需要提供的是targetEntity
和字段名
(即实体类中属性的名称)<?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;
#...
}