Danyloff

Entity по Эвансу


  • ·

· ·

Entity — это один из ключевых концептов в DDD, который представляет собой объект, который имеет уникальную идентичность и может изменять свое состояние. Entity — это не просто набор данных, а объект, который имеет свою жизненный цикл и может быть связан с другими объектами в системе.

В PHP Entity может быть реализован как класс, который содержит свойства и методы для получения и установки значений свойств, а также методы для изменения состояния объекта. Вот пример класса Entity на PHP:

class User {
    private $id;
    private $name;
    private $email;

    public function __construct($id, $name, $email) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }

    public function getEmail() {
        return $this->email;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function setEmail($email) {
        $this->email = $email;
    }
}

В этом примере мы создали класс User, который представляет собой Entity для пользователя. Класс содержит три приватных свойства: $id, $name и $email, и публичные методы для получения и установки значений этих свойств.

Заметьте, что класс User имеет методы setName() и setEmail(), которые позволяют изменять состояние объекта. Это отличает Entity от Value Object, который не может быть изменен после создания.

Теперь рассмотрим пример использования Entity в контексте DDD на PHP. Допустим, у нас есть приложение для управления задачами, и мы хотим использовать Entity для описания задачи.

class Task {
    private $id;
    private $name;
    private $description;
    private $status;

    public function __construct($id, $name, $description, TaskStatus $status) {
        $this->id = $id;
        $this->name = $name;
        $this->description = $description;
        $this->status = $status;
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }

    public function getDescription() {
        return $this->description;
    }

    public function getStatus() {
        return $this->status;
    }

    public function updateStatus(TaskStatus $status) {
        $this->status = $status;

        // Отправляем событие обновления статуса задачи
        $event = new TaskStatusUpdatedEvent($this->id, $status);
        EventDispatcher::dispatch($event);
    }
}

В этом примере мы создали класс Task, который представляет собой Entity для задачи. Класс содержит четыре приватных свойства: $id, $name, $description и $status, и публичные методы для получения значений этих свойств.

Мы также создали метод updateStatus(), который позволяет изменять состояние объекта. Метод updateStatus() принимает объект TaskStatus и изменяет свойство $status объекта Task. Мы также отправляем событие обновления статуса задачи, чтобы уведомить другие части системы об изменении состояния задачи.

Заметьте, что мы использовали Value Object TaskStatus для представления статуса задачи в классе Task. Мы также использовали event-driven programming для обновления статуса задачи и отправки события обновления статуса задачи.

Больше про Value Object вы можете узнать из статьи ранее публиковавшееся на нашем блоге.

Заключение

Entity — это мощный инструмент в DDD, который позволяет описывать объекты в приложении. В PHP Entity может быть реализован как класс, который содержит свойства и методы для получения и установки значений свойств, а также методы для изменения состояния объекта. Entity имеет уникальную идентичность и может быть связан с другими объектами в системе.


Так же интересно

I из SOLID с примерами на PHP

Принцип разделения интерфейса (Interface Segregation Principle, ISP) является одним из пяти ключевых принципов объектно-ориентированного программирования в...

Согласование Laravel и DDD

Эта статья фокусируется на поиске общей основы для использования проектирования, ориентированного на предметную область (Domain-Driven Design или DDD) в...