Как стать автором
Обновить

Используем трейты с пользой

Время на прочтение2 мин
Количество просмотров19K
На хабре уже было несколько статей о трейтах и о том, как их использовать. Но я пока не видел примеров использования с реальными фреймворками, на которых мы пишем каждый день. Я любитель Symfony2 стека и потому именно на нем я покажу, как можно использовать трейты с пользой.

Из-за особенности реализации 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ы с вашими часто используемыми свойствами в сущностях, я с удовольствием их добавлю.
Теги:
Хабы:
Всего голосов 24: ↑14 и ↓10+4
Комментарии14

Публикации

Истории

Работа

PHP программист
117 вакансий

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область