На хабре уже было несколько статей о трейтах и о том, как их использовать. Но я пока не видел примеров использования с реальными фреймворками, на которых мы пишем каждый день. Я любитель Symfony2 стека и потому именно на нем я покажу, как можно использовать трейты с пользой.
Из-за особенности реализации proxy в Doctrine, для любой модели мы обязаны писать геттеры и сеттеры. Но зачем повторять каждый раз одно и то же? Абсолютно каждая сущность имеет id, каждая вторая name и частенько description. Так почему бы это не вынести в трейты?
Теперь описывая очередную модель нам достаточно вписать одну строку, вместо 15.
Ну не здорово ли?
Когда мне пришла такая идея — я нашел парочку библиотек, от широко известных KNPLabs .
Все довольно просто, ка�� использовать — описано в README.
Однако эти библиотеки добавляют целые куски логики, а мне хотелось бы просто сократить код моделей.
Поэтому я вынес большинство используемых трейтов в своем проекте в отдельную либу doctrine-columns.
Библиотека представляет собой пока-что небольшой набор часто-используемых свойств в классах моделей.
Допишем
Теперь можно добавить парочку уникальных свойств, описать какую-то логику, но код модели не будет раздут.
Таким же способом можно описывать базовое поведение связанных сущностей, например у меня в проекте есть
Однако не все так радужно — существует небольшая проблема. Если схема данных у вас берется из аннотаций — ее невозможно переопределить без Strict Standarts варнинга.
Так или иначе — на мой взгляд это очень интересный подход, в первую очередь облегчающий восприятие кода. Присылайте PRы с вашими часто используемыми свойствами в сущностях, я с удовольствием их добавлю.
Из-за особенности реализации proxy в Doctrine, для любой модели мы обязаны писать геттеры и сеттеры. Но зачем повторять каждый раз одно и то же? Абсолютно каждая сущность имеет id, каждая вторая name и частенько description. Так почему бы это не вынести в трейты?
namespace Column; trait Id { /** * @var integer * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @return integer */ public function getId() { return $this->id; } }
Теперь описывая очередную модель нам достаточно вписать одну строку, вместо 15.
class Book { use \Column\Id; }
Ну не здорово ли?
Когда мне пришла такая идея — я нашел парочку библиотек, от широко известных KNPLabs .
Все довольно просто, ка�� использовать — описано в README.
Однако эти библиотеки добавляют целые куски логики, а мне хотелось бы просто сократить код моделей.
Поэтому я вынес большинство используемых трейтов в своем проекте в отдельную либу doctrine-columns.
Библиотека представляет собой пока-что небольшой набор часто-используемых свойств в классах моделей.
Допишем
Book.use Nkt\Column; class Book { use Column\Id; use Column\Name; use Column\Price; use Column\Description; use Column\CreatedDate; public function __construct($name, $description) { $this->setName($name); $this->setDescription($description); $this->setCreatedDate(new \DateTime()); } }
Теперь можно добавить парочку уникальных свойств, описать какую-то логику, но код модели не будет раздут.
Таким же способом можно описывать базовое поведение связанных сущностей, например у меня в проекте есть
Commentable тип, который позволяет добавлять функционал комментариев к любой сущности.Однако не все так радужно — существует небольшая проблема. Если схема данных у вас берется из аннотаций — ее невозможно переопределить без Strict Standarts варнинга.
Так или иначе — на мой взгляд это очень интересный подход, в первую очередь облегчающий восприятие кода. Присылайте PRы с вашими часто используемыми свойствами в сущностях, я с удовольствием их добавлю.
