Таким образом, у меня есть несколько объектов, которые используют мой SluggableTrait
, который содержит поля name
и SluggableTrait
вдоль его методов.
trait SluggableTrait { /** * @var string * @ORM\Column(type="string", length=255, nullable=true) */ private $name; /** * @var string * @ORM\Column(type="string", length=255 * @Gedmo\Slug(fields={"name"}, updatable=false)) */ private $slug; /** * Set name * * @param string $name * * @return SluggableTrait */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set slug * * @param string $slug * * @return SluggableTrait */ public function setSlug($slug) { $this->slug = $slug; return $this; } /** * Get slug * * @return string */ public function getSlug() { return $this->slug; } /** * @return string */ public function __toString() { return $this->getName() ? $this->getName() : 'n/a'; } public function getClassName() { $reflect = new \ReflectionClass($this); return $reflect->getShortName(); } }
Но всякий раз, когда я пытаюсь использовать его в YAML-сопоставленной сущности, база данных не будет создавать свои поля …
Предположим, у меня есть класс Foo
class Foo { use SluggableTrait; /** * @var integer */ private $id; /** * Get id * * @return integer */ public function getId() { return $this->id; } }
С отображением YAML
Utils\DoctrineBundle\Entity\Foo: type: entity id: id: type: integer generator: strategy: AUTO
При обновлении моей схемы (даже при создании новой пустой базы данных) моя таблица foo
будет иметь только поле id
, name
и slug
не существует.
Все работает отлично, если я использую аннотацию в обоих элементах, в знаке и классе. Если смешанное отображение, не работает.
При использовании сопоставления YAML в моей черте, просто чтобы попробовать, я получаю эту ошибку всякий раз, когда я пытаюсь обновить мою схему
[2015-12-07 13:20:33] app.ERROR: Doctrine \ Common \ Persistence \ Mapping \ MappingException: класс 'Utils \ DoctrineBundle \ Entity \ SluggableTrait' не существует (неперехваченное исключение) в / srv / myapp / vendor /doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php line 96 при запуске консольной команды
doctrine:schema:update
{"exception": "[object] (Doctrine \ Common \ Persistence \ Mapping \ MappingException (код : 0): Класс 'Utils \ DoctrineBundle \ Entity \ SluggableTrait' не существует в /srv/myapp/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:96) "}[Doctrine\Common\Persistence\Mapping\MappingException]
Класс 'Utils \ DoctrineBundle \ Entity \ SluggableTrait' не существует
doctrine: schema: update [–complete] [-dump-sql] [-f | -force] [-em [EM]]
Я попытался найти пример YAML с чертой без успеха … Поэтому я застрял прямо сейчас.
Ну, после некоторых тестов Doctrine не позволяет смешивать YAML и ANOTTATION без свойств повторного использования, что, очевидно, является тем, что мы хотим избежать использования Trait (и расширения класса)
Я создал PR, чтобы следовать этому https://github.com/doctrine/common/pull/701
Этот PR позволяет использовать YAML отображаемые черты, но не вызывает некоторые события, поэтому ему нужно идти глубже.