Можно ли переопределить свойство черты PHP в классе потребителя, чтобы использовать аннотации Doctrine2?

Я использую черты для реализации некоторого поведения Taggable в приложении Symfony, использую Doctrine2 для постоянства и аннотации для его настройки.

Основное раздражение, которое я испытываю, заключается в том, что в этой черте моя среда IDE не имеет представления о типе тегов $ this-> и выдает кучу предупреждений. Я довольно пристрастен к тому, чтобы документировать свой код здесь, чтобы другие разработчики могли его легко найти.

trait TaggableMethods {
/** @var \Doctrine\Common\Collections\Collection */
protected $tags; // <-- Can't seem to define here…
public function addTag(Tag $tag) {
$this->tags->add($tag);
}
public function removeTag(Tag $tag) {
$this->tags->removeElement($tag);
}
public function getTags() {
return $this->tags;
}
}

class TaggableThingA {
use TaggableMethods;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="ThingA__Tag")
*/
protected $tags; // <--… because PHP complains about this
}

class TaggableThingB {
use TaggableMethods;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="ThingB__Tag")
*/
protected $tags;
}

Насколько я могу судить, моя проблема в том, что я не могу определить свойство $ tags в признаке, так как мне нужно переопределить аннотации.

Я могу вообще избежать определения тегов $ в TaggableMethods, но для меня это нарушает инкапсуляцию или, по крайней мере, делает код немного сложнее для чтения.

Я могу настроить постоянство, используя Yaml или XML, но все остальные мои сущности используют аннотации.

Поэтому я ищу способ избежать генерируемого уведомления о времени выполнения, которое Symfony превращает в ContextErrorException, убивая мой скрипт во время разработки.

Это, вероятно, связано с «Можем ли мы использовать черты, чтобы отобразить многие отношения с doctrine2?» а также «Черты — конфликт свойств с родительским классом«

Кроме того, поведение для унаследованных методов, упомянутых вPHP 5.4: почему классы могут переопределять методы черты с другой сигнатурой?«Звучит очень близко к тому, что я хочу для свойств — кто-нибудь может объяснить, почему существует разница между свойствами и методами?

4

Решение

Вы не можете переопределить черту, но вы можете переименовать ее.

Пример этого здесь!

https://github.com/slimphp/Slim/blob/3.x/Slim/App.php#L47-L50

0

Другие решения

Поздно, но это может кому-то помочь. Вы можете использовать ассоциацию или атрибуты переопределения (аннотации @AssociationOverrides, @AttributeOverrides) как описано в разделе 6.4. Переопределение.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector