Где лучше всего добавлять дополнительные данные к запросу?
Есть потребность указывать статус поста (на модерации или опубликован) в зависимости от роли пользователя, который этот материал размещает или обновляет. Но возникает проблема с пониманием, где именно добавлять данные к запросу. У меня есть несколько вариантов:
1. Создать middleware и к текущему request добавлять post_status, который считается исходя из роли пользователя.
2. Использовать метод в своем кастомном Request: prepareForValidation().
3. Менять в обсервере (самый плохой вариант).
Какой из этих вариатов стоит использовать, какие дополнительные варианты есть, потому что не всегда нужно будет прикреплять к запросу какое-то вычисляемое свойство?
Подводные камни, которые сбивают с толку: в случае с мидлваром, на каждый добавляемый элемент к запросу, мне придется писать свой мидлвар (например прикрепление статуса поста, прикрепление ip комментатора к комментарию, прикрепление user_id и тд).
В случае со своим Request, я могу прикреплять те данные, которые мне потребуются ИМЕННО для этого запроса, например StorePostRequest, UpdatePostRequest и так далее, но не уверен что с логической точки зрения нормально добавлять какие-то данные к запросу в превалидации (в документации описывается изменение каких-то уже существующих полей в запросе).
В случае с обсервами все вообще плохо, потому что модель одна, и например если админ захочет обновить запись, но не менять ей статус (опубликовано или на модерации) скрипт будет все равно присваивать свой статус в зависимости от роли пользователя, и для админа записи всегда будут публиковаться, а не оставаться на модерации.
А зачем всё это вообще делать в контексте именно запроса? Почему не в событиях, например, или не в специализированные методы модели эту логику вынести, обмазав какой-нибудь стейт-машиной?
скрипт будет все равно присваивать свой статус
Скрипт будет делать ровно то, что вы в него запрограммируете.
А если сделать так
1. Добавить в таблицу поле status, при добавлении поста присваиается значение по дефолту - 0, на модерации.
2. В админке сделать кнопку - Опубликовать, для изменения статуса на 1, опубликовано
Ни обсервер, ни запрос тут вообще не нужны.
В вашем случае всеми данными управляет бизнес логика в том месте где она выполняется. Если опустить все принципы разработки, то условным местом выполнения будет метод контроллера. Ну или тот бизнесовый класс который он вызовет, что более правильно. Представляю работать с кодом после вас, захожу я, прописываю тот статус который требуется в новой задаче, а он все равно ставится какой-то иной и начинаю я искать, а куда же его изменение засунул Алексей Скляров
Представляем себе ситуацию, что в проекте потребуется возможность создать пост консольной командой (не шибко реалистично, но всё же) — внезапно, вариант №3 остаётся единственным.
Правда, желательно использовать не обсерверы (они, в целом, не очень для логики, чем её больше, тем больше они начинают напоминать макаронного монстра), а какие-то сервисные классы, которые будут содержать в себе всю необходимую логику для создания поста, раз она сложнее простейшего CRUD'а.