пятница, 5 июня 2015 г.

Action-Domain-Responder

Мой велосипед ExampleCMS развивается, хочу поделиться своим соображениями по поводу архитектуры, которые я начал в ней использовать.

В интернете по словам что в заголовке можно найти статейки, но у меня немного по другому.

Action, является реализацией паттерна команда, он не знает о Responder, но может взаимодействовать с Domain. А именно умеет получать Domain, настраивать его и выполнять какие-то действия связаные с ним, через сервисы или напрямую.

Domain - знает только о своих составных частях, обычно состоит из репозитория, сущностей. Отвечает за бизнесс-логику.

Responder - не знает о Action. Но может запрашивать Domain, при этом не может настраивать Domain и выполнять его команды (выполнять работу Action).

Это очень элегантная архитектура, но она очень тяжела для воспроизведения, так как требует дополнительных сил на реализацию сохранения состояния в системе.

Простейшая реализация
class Domain
{

    protected $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

}

class Responder
{

    public $domain;

    public function getContent()
    {
        return $this->domain->getName('ivan');
    }

}

class Action
{

    public $domain;

    public function execute()
    {
        $this->domain->setName('Ivan');
    }

}

$domain = new Domain;
$action = new Action;
$action->domain = $domain;
$action->execute();
$responder = new Responder;
$responder->domain = $domain;
echo $responder->getContent();


Основной плюс в отличии от MVC которую используют все популярные php фреймворки в том что контроллер не знает о представлении и вообще не интересуется им, а интересуется только моделью.

2 комментария:

  1. Ответы
    1. Потому что компоненты системы знают о себе меньше, что делает их более независимыми друг от друга, что в свою очередь увеличивает гибкость кода.

      Удалить