Если я правильно понял: вы хотите создать сопоставление и реализацию для интерфейса без использования абстрактного класса и повторяющегося кода.
PHP имеет черты. Вы можете создать черту с общей реализацией интерфейса. Из опыта я знаю, что вы также можете добавить отображение аннотаций доктрины в черту, и все будет хорошо работать.
Создать TaggableTrait. Он ведет себя как класс или интерфейс. Он находится в пространстве имен и будет загружен вашим автозагрузчиком, если вы добавите его с помощью use
.
namespace My\Namespace;
use Doctrine\ORM\Mapping as ORM;
trait TaggableTrait
{
/**
* @ORM\ManyToMany(targetEntity="Some\Namespace\Entity\Tag")
*/
protected $tags;
public function addTag(TagInterface $tag)
{
$this->tags->add($tag);
}
public function removeTag(TagInterface $tag)
{
$this->tags->removeElement($tags);
}
public function deleteTag(TagInterface $tag)
{
$this->removeTag($tag);
}
public function getTags()
{
return $this->tags;
}
}
И в вашем taggable лица:
namespace Some\Namespace\Entity;
use Some\Namespace\TaggableInterface;
use My\Namespace\TaggableTrait;
use Doctrine\ORM\Mapping as ORM;
//...
/**
* @ORM\Entity
*/
class TaggableEntity implements TaggableInterface
{
use TaggableTrait;
public function __construct()
{
$this->tags = new ArrayCollection();
}
// rest of class code
}
Обратите внимание, что use
внутри класса имеют различное значение. Он добавляет черту и не имеет ничего общего с импортом пространства имен.
Вы всегда должны инициализировать $tags
в своем конструкторе, черта не может этого сделать.
Таким образом, вы можете создать только однонаправленную связь. Если вам нужна дополнительная настройка, удалите отображение из свойства и добавьте его в класс.
Спасибо за ваш ответ, интересная идея с использованием черт :) Не могли бы вы показать мне некоторую базовую реализацию одного из методов, например. addTag (я уверен, как создать отношения)? Спасибо – Jadro007
@ Jadro007 Я отредактировал свой ответ. Я также добавил 'removeTag', потому что' removeXXX' является доктриной/symfony. Это гарантирует, что symfony не запутается в ситуациях, таких как редактирование тегов через форму. –
nice :) Я правильно понимаю, что доктрина генерирует объект отношения M: N для каждого объекта, который использует TaggableTrait? – Jadro007