Comments 4
А как-то менее многословно такие вещи можно реализовать?
Запрос на удобном языке, в котором всё понятно, раздули в 2 раза — а что взамен получили?
Запрос на удобном языке, в котором всё понятно, раздули в 2 раза — а что взамен получили?
Согласен. Многословность доставляет некоторые неудобства, но преимущества в композиции, реиспользовании и единой точке объявления бизнес-правил, что упрощает сопровождение и рефакторинг.
RulerZ позволяет более компактно описывать бизнес-првила, но он лишён многих преимуществ Happyr Doctrine Specification.
UFO just landed and posted this here
Не совсем так, но общий смысл тот же
class Enabled extends BaseSpecification
{
protected function getSpec()
{
return Spec::eq('enabled', true);
}
}
class PublishedBroadcast extends BaseSpecification
{
protected function getSpec()
{
return new Enabled();
}
class PublishedSeries extends BaseSpecification
{
private $broadcast_alias = '';
public function __construct(
string $broadcast_alias,
?string $dql_alias = null
) {
$this->broadcast_alias = $broadcast_alias;
parent::__construct($dql_alias);
}
protected function getSpec()
{
return Spec::andX(
new PublishedBroadcast($this->broadcast_alias),
new Enabled()
);
}
class SeriesOfBroadcast extends BaseSpecification
{
private $broadcast;
public function __construct(Broadcast $broadcast, ?string $dql_alias = null)
{
$this->broadcast = $broadcast;
parent::__construct($dql_alias);
}
protected function getSpec()
{
return Spec::eq('broadcast', $this->broadcast->getId());
}
}
Конечный запрос всего в несколько строчек которые легко читаются:
$series = $this->rep_series->match(Spec::andX(
Spec::innerJoin('broadcast', 'b')
new PublishedSeries('b'),
new SeriesOfBroadcast($broadcast),
Spec::slice($slice_size, $slice_number)
), Spec::cache(3600));
На более сложных бизнес-правилах профит будет больше.
Sign up to leave a comment.
Спецификации в PHP