>  기사  >  백엔드 개발  >  집중적인 도메인 애플리케이션 생성. Symfony 접근 방식(엔티티 저장)

집중적인 도메인 애플리케이션 생성. Symfony 접근 방식(엔티티 저장)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-17 03:30:04744검색

Creating focused domain applications. A Symfony approach (Saving the entity)

소개

이 시리즈의 세 번째 게시물에서는 시리즈의 첫 번째 기사에서 생성한 DTO에서 데이터베이스에 지속될 준비가 된 엔터티를 생성하겠습니다.

UserInputDTO를 엔터티로 변환

이 섹션을 시작하기 위해 교리를 사용하여 데이터베이스와 통신하고 User 엔터티가 다음과 같다고 가정해 보겠습니다.

#[ORM\Entity(repositoryClass: UserRepository::class)]
class User
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 150)]
    private string $firstname;

    #[ORM\Column(length: 255)]
    private string $lastname;

    #[ORM\Column(length: 25)]
    private string $dob;

    #[ORM\Column]
    private \DateTimeImmutable $createdAt;

    #[ORM\Column]
    private string $token;

    // getters and setters
}

email, firstname, lastnamedob 필드는 UserInputDTO 값으로 채워지고 createdAttoken 필드는 다음 규칙에 따라 채워집니다.

  • createdAt 필드에는 현재 날짜가 저장됩니다.
  • 토큰 필드에는 50자의 영숫자 문자열이 포함됩니다.

엔티티 필드를 어떻게 채울지 결정했으므로 코드의 이 부분은 도메인 비즈니스 규칙을 포함하므로 도메인에 속하게 됩니다. 따라서 이러한 작업을 수행하려면 서비스 도메인이 필요합니다. 코딩해 보겠습니다.

class UserEntityBuilder {

    public function buildEntity(UserInputDTO $userInputDto): User
    {
        $user = new User();
        $user->setEmail($userInputDto->email);
        $user->setFirstname($userInputDto->firstname);
        $user->setLastname($userInputDto->lastname);
        $user->setDob($userInputDto->dob);
        $user->setToken(bin2hex(random_bytes(50)));
        $user->setCreatedAt(new \DateTimeImmutable());

        return $user;
    }
}

보시다시피 UserEntityBuilder buildEntity 메소드는 미리 설정된 규칙에 따라 User 엔터티를 생성하고 해당 엔터티를 반환합니다.

엔터티를 생성하고 저장하는 응용 서비스

이제 엔터티 저장과 관련된 프로세스를 조정하는 서비스가 필요합니다.

  • 최근 생성된 UserEntityBuilder 도메인 서비스를 사용하여 User 엔터티를 생성합니다.
  • 데이터베이스에 엔터티를 유지하기 위해 EntityManager 서비스 교리를 사용합니다. EntityManager 서비스는 symfony/orm-pack 구성 요소
  • 를 통해 Symfony 프레임워크에서 제공되므로 인프라 서비스로 간주되어야 합니다.

코딩해 보세요.

class UserCreator {

    public function __construct(
        private readonly UserEntityBuilder $userEntityBuilder,
        private readonly EntityManagerInterface $em,
    ){}

    public function createUser(UserInputDTO $userInputDto): object
    {
        $user = $this->userEntityBuilder->buildEntity($userInputDto);
        $this->em->persist($user);
        $this->em->flush();

        return '.....'; // Return a DTO ready to be used by the presentation layer
    }
}

위 코드에서 볼 수 있듯이 UserCreator 애플리케이션 계층 서비스는 먼저 UserEntityBuilder를 사용하여 엔터티를 생성한 다음 Doctrine 엔터티 관리자를 사용하여 이를 데이터베이스에 저장합니다. .

'return' 줄이 완전하지 않은 것을 눈치채셨을 것입니다. ¿ 여기에 무엇을 반환해야합니까?. 이 시리즈의 다음 기사와 마지막 기사에서 살펴보겠습니다 :)

엔터티는 어떻습니까? 그들은 도메인에 속해 있습니까?

좋은 질문입니다. 제 생각에는 데이터베이스 테이블을 애플리케이션의 객체에 매핑하기는 하지만 프로젝트의 데이터 모델에 관한 결정을 캡슐화하기 때문에 이는 우리 도메인에 속할 것입니다.
이제 그들이 우리 도메인에 속할 수 있다는 사실이 DTO로 사용될 수 있다는 의미는 아닙니다. 이는 격리되어야 하며 데이터베이스에 데이터를 저장하고 데이터베이스에서 데이터를 수신하는 데에만 사용해야 합니다.

결론

이 세 번째 기사에서는 데이터베이스에 유지할 준비가 된 사용자 엔터티를 생성하기 위한 도메인 서비스를 생성했으며, 도메인 서비스를 사용하여 사용자 및 엔터티를 생성함으로써 엔터티를 데이터베이스에 저장하는 애플리케이션 서비스도 생성했습니다. 교리 엔터티 관리자에게 저장하세요.
다음 기사와 마지막 기사에서는 프리젠테이션 레이어로 반환할 준비가 된 저장된 사용자 정보를 사용하여 출력 DTO를 생성하는 방법을 뜨겁게 배울 것입니다.

내 콘텐츠가 마음에 들고 재미있게 읽고 PHP에 대해 더 자세히 알아보고 싶다면 PHP와 Symfony Framework를 사용하여 작업 지향 API를 만드는 방법에 대한 내 전자책을 읽어 보세요. 여기에서 찾을 수 있습니다: PHP 및 Symfony 프레임워크를 사용하여 작업 지향 API 구축: 단계별 가이드

위 내용은 집중적인 도메인 애플리케이션 생성. Symfony 접근 방식(엔티티 저장)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.