...

вторник, 25 марта 2014 г.

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

На хабре уже было несколько статей о трейтах и о том, как их использовать. Но я пока не видел примеров использования с реальными фреймворками, на которых мы пишем каждый день. Я любитель 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ы с вашими часто используемыми свойствами в сущностях, я с удовольствием их добавлю.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий