Изменение полей сущностей

Обсуждаем, как правильно строить приложения
Ответить
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Изменение полей сущностей

Сообщение BrusSENS »

Всем привет! Задумался о том, как лучше хранить изменения состояния сущностей. Реализуя репозитории для РСУБД нужно как-то получать список измененных полей для обновления. Сейчас имеем сущность User:

Код: Выделить всё

class User
{
    public const STATUS_ACTIVE = 1;
    public const STATUS_WAIT = 2;
    public const STATUS_BLOCKED = 3;

    protected $id;
    protected $login;
    protected $authKey;
    protected $passwordHash;
    protected $email;
    protected $status;
    protected $createdAt;
    protected $updatedAt;

    public function __construct(
        $id,
        string $login,
        string $email,
        string $passwordHash,
        string $authKey,
        int $status,
        \DateTimeImmutable $createdAt,
        \DateTimeImmutable $updatedAt
    )
    {
        $this->id = $id;
        $this->login = $login;
        $this->email = $email;
        $this->passwordHash = $passwordHash;
        $this->authKey = $authKey;
        $this->status = $status;
        $this->createdAt = $createdAt;
        $this->updatedAt = $updatedAt;
    }
    public function getId()
    {
        return $this->id;
    }
    public function getLogin(): string
    {
        return $this->login;
    }
    public function getAuthKey(): string
    {
        return $this->authKey;
    }
    public function getEmail(): string
    {
        return $this->email;
    }
    public function getStatus()
    {
        return $this->status;
    }
    public function getCreatedAt(): \DateTimeImmutable
    {
        return $this->createdAt;
    }
    public function getUpdatedAt(): \DateTimeImmutable
    {
        return $this->updatedAt;
    }
    public function isActive()
    {
        return $this->status === self::STATUS_ACTIVE;
    }
    public function isWait()
    {
        return $this->status === self::STATUS_WAIT;
    }
    public function isBlocked()
    {
        return $this->status === self::STATUS_BLOCKED;
    }

    public function changeLogin(string $login)
    {
        if($login !== $this->login) {
            $this->login = $login;
            $this->flashEvent(new UserChangeLoginEvent($this));
        }
    }

    public function changeEmail(string $email)
    {
        if($email !== $this->email) {
            $this->email = $email;
            $this->flashEvent(new UserChangeEmailEvent($this));
        }
    }

    public function changePassword(string $password, PasswordService $service)
    {
        if(!$service->validatePassword($password, $this->passwordHash)) {
            $this->passwordHash = $service->hashPassword($password);
            $this->flashEvent(new UserChangePasswordEvent($this));
        }
    }

    public function changeStatus(int $status)
    {
        if($status !== $this->status) {
            $this->status = $status;
        }
    }

    public function isPasswordRelevant(string $password, PasswordService $service): bool
    {
        return $service->validatePassword($password, $this->passwordHash);
    }

    public function activate()
    {
        $this->status = self::STATUS_ACTIVE;
    }

    public function waiting()
    {
        $this->status = self::STATUS_WAIT;
    }

    public function block()
    {
        $this->status = self::STATUS_BLOCKED;
    }
}
Данную сущность и передаём в репозиторий для добавления/сохранения.
Возникает вопрос, каким образом лучше контролировать список измененных полей сущности для обновления?
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Изменение полей сущностей

Сообщение samdark »

Два варинта:

1. В сеттерах накапливать изменения в event-ы.
2. Примерно как сделаны dirty attributes в AR Yii.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Изменение полей сущностей

Сообщение ElisDN »

При извлечении из БД по аналогии с IdentityMap записывать старые значения в переменную. А при сохранении делать array_diff.
Аватара пользователя
BrusSENS
Сообщения: 565
Зарегистрирован: 2012.07.26, 06:51
Откуда: Новороссийск
Контактная информация:

Re: Изменение полей сущностей

Сообщение BrusSENS »

Спасибо за ответы! Сделал правда сразу же, как реализовано в AR.
Native Web - небольшой блог о веб разработке (временно на ремонте)
Режим обслуживания сайта для Yii 2.x.x
Ответить