Pull to refresh

Comments 4

А как-то менее многословно такие вещи можно реализовать?
Запрос на удобном языке, в котором всё понятно, раздули в 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.

Articles