ADRの概要
- Action-Domain-Responder
- ソフトウェアアーキテクチャパターンの1つ
- MVCの改良版
MVCと違うところ
1つのアクションに対して、そのリクエストからレスポンスを定義する。
MVCの場合
例えばMVC実装だと、1つのコントローラーに
- index
- insert
- update
- delete
などアクションを複数定義する。
ADRの場合
1クラス1アクションにより
- シンプルなリクエスト→レスポンスの流れ
- 1クラスの責務が明確
構成
Action
リクエストを受け取り、ドメインの処理結果をレスポンダに渡す
Domain
必要な処理を行い結果を返す
ビジネスロジックはここに含まれる
Responder
ドメインの処理結果を受け取り、必要な準備を行いレスポンスを返す
実装例
PHP/Laravel
Actionクラス
- Controllerクラスを継承
- コンストラクタでドメインオブジェクトとレスポンダオブジェクトを注入
- レスポンダに渡す処理をinvoke(マジックメソッド)で定義
class HogeIndexAction extends Controller
{
protected $domain;
protected $responder;
public fucntion __construct(
Domain $domain,
Responder $responder
) {
$this->domain = $domain;
$this->responder = $responder;
}
public function __invoke(Request $request): Response
{
return $this->responder->response(
$this->domain->get()
);
}
}
Domainクラス
class HogeIndexDomain
{
public function get()
{
/*
* ビジネスロジック等
*
*/
// 処理したデータを返す
return ['hoge' => 'fuga'];
}
}
Responderクラス
class HogeIndexResponder
{
protected $response;
protected $view;
public function __construct(Response $response, ViewFactory $view)
{
$this->response = $response;
$this->view = $view;
}
public function response($data): Response
{
if (empty($data)) {
// 404ステータスコードと共にエラー表示
}
// 取得したデータをセットしたviewを返す
$this->response->setContent(
$this->view->make('hoge.index', ['hoge' => $data])
);
return $this->response;
}
}