Задать вопрос
Gromfer
@Gromfer
Увлекаюсь Laravel

Корректно ли передавать объекты (с приватными свойствами и геттерами) во view только для чтения?

Сделал архитектуру своего проекта так, что классы написал под сущности из базы данных. Причем связи в БД это иногда композиция в классах и так далее. Так, например в классе Message могут хранится экземпляры классов пользователей как идентификация кто и кому его отправлял. Много всяких DTO объектов. Сделал я это так, потому что не хочу использовать Eloquent. Мне не нравится что объект может сам себя сохранить в базе данных, сделать еще какую-то фигню ($user->all() ). Для этого у меня есть репозитории: они достают строку из базы данных, передают конструктору класса, и возвращают уже объект который там сам отвечает (инкапсулирует) как за своё состояние, так и за поведение (или генерируют новые). Для меня это очень удобно, а главное укладывается в голове. И порождает меньше зависимостей. Сущности сами по себе. Получается контроллер может дёрнуть сервис, сервис дёргает репозитории и получает сущности (классы). Далее эти сущности как-то взаимодействуют, сервис отправляет их обратно в репозиторий на сохранение в БД.

Вопрос: корректно ли передавать такие объекты во view для чтения свойств? Они естественно приватные (с геттерами), но меня беспокоит что теоретически объект может изменить своё состояние прямо в представлении, вызвав какой-нибудь свой метод. Я пробовал для каждого класса реализовать метод "toArray()" но: 1) постоянные проблемы с типами (репозитории возвращают тогда не объекты а collect) 2) когда объект, то PHPstorm помогает подсказками что удобно, а массив тяжело запомнить 3) в объектах может быть много уровней композиций

Под словом корректно ли я подразумеваю то, что в перспективе для большого и долгого проекта с кучей таблиц, не выйдет ли это когда-нибудь боком (трудно будет отлаживать например).

Вот пример одного такого конструктора класса Message:
public function __construct($userFrom, $userTo, $message, $id = null)
    {
        $this->id = $id;
        $this->userFrom = $userFrom;
        $this->userTo = $userTo;
        $this->message = (string)$message;
        $this->created_at = now();
    }
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
dmitriylanets
@dmitriylanets
веб-разработчик
вытягивать сущности базы данных в слой представления это такое себе, измените поле и все шаблоны использующие накроются, причем накроются что вы не заметите например уведомление будет приходить клиенту а там пропадет его имя.
поэтому я в вьюху стараюсь передать нужную структуру массив/DTO
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы