Symfony Flex를 사용한 DDD 및 육각형 아키텍처

빈 Symfony Flex 프로젝트에서 육각형 아키텍처와 DDD를 어떻게 따를 수 있는지 테스트하기 위해 작은 프로젝트를 작성했습니다. 아이디어는 우리의 모든 코드를 Symfony와 최대한 독립적으로 유지하는 것이었습니다.


내용을 시작하기 전에 저를 팔로우하시면 이 시리즈가 계속될 때 알림을 받게 됩니다.


.ltag__user__id__1298 .follow-action-button {
배경색: #e0008a !중요;
색상: #ffffff !중요;
테두리 색상: #e0008a !중요;
}



빅토르 팔콘




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 작업에 대해 하나의 컨트롤러만 있습니다. 지금은 리드를 생성하는 작업이 하나뿐이며 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.



그런 다음 모든 것이 정상이면 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에서 일부 데이터를 가져오려면 프로젝트에서 이미 생성된 Query Bus를 사용할 수 있습니다.

결과는 다음과 유사합니다.

$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에서 컨트롤러 경로 변경



컨트롤러를 새 경로로 이동하려면 Symfony에서 파일config/services.yaml에 컨트롤러를 구성해야 합니다. 이 정도면 충분합니다.

App\Controller\:
    resource: '../app/Controller/'
    tags: [ 'controller.service_arguments' ]



며칠 후에 폴더에 프로젝트를 구성하는 방법과 이 구조와 함께 작동하도록 Symfony를 구성하는 방법에 대해 이야기하겠습니다.

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

좋은 웹페이지 즐겨찾기