シンフォニーフレックスを持つDDDと六角形アーキテクチャ


私は、空のシンフォニーFlexプロジェクトでどのように六角形のアーキテクチャとDDDに従うことができるかをテストするために、小さなプロジェクトを書きました.その考えは、我々のすべてのコードを無能なものから、できるだけ多くのものにしておくことだった.
内容に入る前に、私に従ってください、そして、このシリーズが続くとき、あなたは通知を得ます:
.ltag__user__id__1298 .アクションボタン
背景色:角20.000 A!重要
カラー:竜華ffffff!重要
ボーダーカラー:△E 0008 A!重要


ctorのfalc



Because this is just an example, I made only one endpoint to create Leads . But I implemented an Event Bus one sync and another asynchronous using MySql, and we also have a Command Query and a Command Bus because we are also following CQRS.

In this first article I'm going to explain how are our controllers because they are the layer that it's near Symfony because we are using the framework to process request and routes.

In the future we will cover more topics like:

  1. (this article)
  2. Create a Command and Query Bus
  3. Make an Event Bus sync and asynchronous
  4. How to configure PHP Unit to make unit and integration tests
  5. Configure and install Behat to make feature testing in our Symfony project

Let's start with controllers.

コントローラ


我々は、我々が実装した各APIアクションの1つのコントローラを持っています.今私はリードを作成する1つのアクションを持っているし、コントローラを見つけることができますapp/Controller/Leads/LeadsPostController.php . 我々は、コントローラを格納していますapp それはフレームワークに完全に添付された唯一のコードですので、フォルダ.我々のコードの残りsrc .
あなたがコントローラで見ることができるように、それは非常に簡単です.プリミティブ型からリクエストを取得し、完全に理解できるコマンドを作成するだけで、リクエストタイプに依存しません.

If in the future, we want to create leads from the command line, for example, we can use this same command.


そして、それがすべてであるならば、我々はAを返しますHTTP_CREATED または、しない場合は、メッセージの応答は、何が起こっているかを明確にします.
$name = $request->get('name');
$email = $request->get('email');

try {
    $this->commandBus->dispatch(new CreateLeadCommand($name, $email));
    return new Response(null, Response::HTTP_CREATED);
} catch (DuplicatedLeadException $e) {
    return new ErrorResponse($e, Response::HTTP_BAD_REQUEST);
}
我々はまだこのプロジェクトの例を持っていないが、APIからいくつかのデータを取得したい場合は、クエリバスを使用して、プロジェクトで既に作成されていることができます.
結果は次のようになります.
$id = $request->get('id');

try {
    /** @var Lead $lead */
    $lead = $this->queryBus->dispatch(new GetLeadCommand($id));
    return new Response($lead);
} catch (NotFoundException $e) {
    return new ErrorResponse($e, Response::HTTP_BAD_REQUEST);
}
この簡単な構造に続いて、我々は望むものを何でもする小さなコントローラを持つことができます.
我々のコントローラがちょうど我々が制御して、完全に理解する何かへの要求を変えて、確認することは、重要です.プリミティブを渡すのを避ける必要があるsrc フォルダ.

シンフォニーのコントローラのパスを変更する


コントローラを新しいパスに移動するには、symfonyでファイルを設定する必要がありますconfig/services.yaml . このようなことで十分です.
App\Controller\:
    resource: '../app/Controller/'
    tags: [ 'controller.service_arguments' ]
数日後に、私はこのプロジェクトでどのようにプロジェクトをフォルダーで構成するか、symfonyを設定する方法について話します.

All the code it's public available in this repository.