PHP7 と Laravel を元にしたサンプル実装です。
アーキテクチャは sample-boot-hibernate を参考にしています。
フレームワークではないので、 Laravel Artisan で生成したプロジェクトの API 実装サンプルとして利用して下さい。
UI 側の実装サンプルについては sample-ui-vue / sample-ui-react を参照してください。
※ 参考実装レベルです。製品水準のコードが含まれているわけではありませんし、まだ運用を意識した十分な精査ができていません。
オーソドックスな三層モデルですが、横断的な解釈としてインフラ層を考えています。
レイヤ | 特徴 |
---|---|
UI | ユースケース処理を公開 ( 必要に応じてリモーティングや外部サイトを連携 ) |
アプリケーション | ユースケース処理を集約 ( 外部リソースアクセスも含む ) |
ドメイン | 純粋なドメイン処理 ( 外部リソースに依存しない ) |
インフラ | DI コンテナや ORM 、各種ライブラリ、メッセージリソースの提供 |
UI 層の公開処理は通常テンプレートを用いて行いますが、本サンプルでは異なる種類のクライアント利用を想定して RESTfulAPI での API 提供のみをおこないます。 ( 利用クライアントは別途用意する必要があります )
Laravel は様々な利用方法が可能ですが、本サンプルでは以下のポリシーで利用します。
- API サーバでの運用を前提。
- ライブラリ化しないのでモジュールを vendor 等に切り出さない。
- 例外処理は終端 ( app/Exceptions/Handler ) で定義。
- DI は多用せずにインフラ層のコンポーネント束ねたヘルパークラスを利用。
- ORM 実装として Eloquent を利用。
- 認証方式はベーシック認証でなく、昔からよくある HttpSession で。
- パッケージ管理は Composer で行う。
- 既にあるものはなるべく作らない。
PHP7 を前提としています。
- PSR 系の規約はなるべく守る。
- 型はなるべく明示する
- インターフェースの濫用をしない。
- ドメインの一部となる DTO などはクラスにせず連想配列で。
パッケージ/リソース構成については以下を参照してください。
[root]
app … psr-4 の自動ローディングルート
Console … コンソール関連
Context … インフラ層 [ Original ]
Exceptions … 例外管理
Http
Controllers … UI層
Middleware … ミドルウェアプラグイン
Requests
- Kernel.php
Models … ドメイン層 [ Original ]
Providers
- AppServiceProvider.php … DI 定義
Tests … テスト関連 [ Original ]
Usecases … アプリケーション層 [ Original ]
Utils … ユーティリティ [ Original ]
User.php
bootstrap
config … 設定ファイル
database … マイグレーション定義 / 初期データ管理
public … HTTP 公開定義
resources … 国際化対応 / Web リソース系
routes
- routes.php … API ルーティング
storage
tests … PHPUnit 関連リソース
vendor … Composer 経由で取得する依存ライブラリ
- artisan … コマンドラインインターフェース
- composer.json … プロジェクト構成定義
- phpunit.xml … 単体テスト定義
サンプルユースケースとしては以下のようなシンプルな流れを想定します。
- 口座残高 100 万円を持つ顧客が出金依頼 ( 発生 T, 受渡 T + 3 ) をする。
- システムが営業日を進める。
- システムが出金依頼を確定する。(確定させるまでは依頼取消行為を許容)
- システムが受渡日を迎えた入出金キャッシュフローを口座残高へ反映する。
本サンプルは PHP7 や Composer に依存しているため、事前に双方のインストールが必要となります。
インストールの手順については公式のドキュメントを参照してください。
■ PHP
http://php.net/manual/ja/install.php
■ Composer
https://getcomposer.org/download/
本プロジェクトには依存ライブラリが含まれていないため、以下のコマンドを実行してライブラリをダウンロードしてください。
cd [project_root]
composer update
composer の呼び出し方は環境毎に異なるので必要に応じて読み変えてください。
※ Composer は大量のライブラリを自動でダウンロードするため、容量制限の縛りが緩いネットワーク回線を利用して実行するようにしてください。
本サンプルでは DB に SQLite を用いています。
以下の手順で DB ファイルを作成してください。
cd [project_root]
php artisan migrate:refresh --seed
PHPUnit 実行時にスキーマが初期化されてしまうため、サーバ起動前は忘れずに実行してください
組み込みサーバで本サンプルを起動するにはコンソールから次のコマンドを実行してください。
cd [project_root]
php artisan serve --port=8080
実際の本番環境では Nginx + PHP-FPM などの組み合わせが良く利用されています。
sample-ui-vue / sample-ui-react どちらかのサンプルを起動して、ブラウザから「http://localhost:3000/」を呼び出してください。 ※バックグラウンドで本サンプルの API を実行します。
認証を有効状態にしているため 「 sample / sample 」 でログインしてください。
ユニットテストの実施は以下のコマンドで
cd [project_root]
./vendor/bin/phpunit
個別に実行したい時は以下のような感じで
./vendor/bin/phpunit tests/Models/Asset/CashInOutTest.php
現状 DB 設定を流用しているのでテストを流した後に動作確認する際はマイグレーション処理を忘れずに
インフラ層の簡単な解説です。
※プロジェクト構成の詳細な定義は composer.json
を参照してください
Laravel の永続化機構 ( Eloquent ORM ) をそのまま利用しています。
トランザクションを常にかけることはせず、必要な箇所に限定して明示的な指定を行っています。
認証のみを実装しています。認証モデルは Laravel 標準の User
を利用していますが、ドメインモデル上は Login
概念で置き換えています。
App\Http\Controllers\Auth\LoginApiController
は API モデルという事もあり、シンプルに実装を拡張しています。
未実装
汎用概念としてフィールド単位にスタックした例外を持つ ValidationException
を提供します。
例外は末端の UI 層でまとめて処理します。具体的にはアプリケーション層、ドメイン層では用途別の実行時例外をそのまま上位に投げるだけとし、例外捕捉は App\Exceptions\Handler
で行っています。
App\Context\Timestamper
を経由して取得します。休日等を考慮した営業日算出はドメイン概念が含まれるので BusinessDayHandler
で考慮します。
未実装
PHPUnit を用いてモデルを中心としてテストを行っています。
テストは以下のコマンドで実行してください。
cd [project_root]
vendor/bin/phpunit
本サンプルのライセンスはコード含めて全て MIT License です。
Laravel を用いたプロジェクト立ち上げ時のベース実装サンプルとして気軽にご利用ください。