Как правильно организовать бизнесс-логику в Yii2?

Здравствуйте. Есть список товаров(например, услуга), которые хранятся в БД , которые можно купить и использовать в определенных целях. До недавнего времени все товары можно было кастомизировать. В текущий момент вводится разграничение-можно кастомизировать все товары, кроме самого дешевого. Это ограничение касается как внешнего вида(при просмотре товара недоступны некоторые елементы интерфейса, позволяющие редактировать и сохранять), так и действий(екшн по сохранению полей модели не срабатывает с самым дешовым товаром).

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

Как лучше архитектурно (с возможностью оптимальных сложности и качества поддержки) реализовать подобные свойства на товарах?

В данный момент всё разруливается проверкой текущего товара по имени(товаров не больше 10, имена не меняются и являются уникальными) с последующей передачей значения результата проверки на view.

Для меня в данный момент это есть самое простое решение, поскольку нет никакой информации о будущих изменениях в действиях с товарами, код понятен, исправить можно будет быстро, проверка осуществляется в соответственной модели сущности.

Рассматриваю два возможных решения.
1)Ввести в модели товара дополнительное флаговое поле и закодировать опцию по редактированию, в дальнейшем остается пространство для создания дополнительных признаков по оставшимся битам поля. Возможно, не хватит гибкости для реализации замороченных условий, но дополнительную логику по проверке можно реализовать, например в модели.

2) Реализовать с помощью RBAC в виде пермишенов. Мне это решение подсказали, но я не совсем понимаю, как его оптимально применить, и мне кажется, что данное решение будет слишком громоздким, хотя, возможно, более гибким. Представляется ли решение применить RBAC для такой задаче в принципе?

Что скажете по поводу первого и второго методов?
Посоветуйте, пожалуйста, хорошее решение из своей практики, для реализации подобных опций на сущностях.
Заранее спасибо.
  • Вопрос задан
  • 676 просмотров
Пригласить эксперта
Ответы на вопрос 3
qonand
@qonand
Software Engineer
С одной стороны - действительно можно легко реализовать подобный функционал на RBAC с помощью его правил. Но нужно понимать что RBAC (Role Based Access Control) - это система разграничения прав ДОСТУПА на основе РОЛЕЙ. Ваша задача не относиться к РАЗГРАНИЧЕНИЮ ПРАВ, а относиться к логике отображения товара - поэтому, на мой взгляд, подобному функционалу не место в RBAC, это логически не правильно.

Введение дополнительного битового поля лучшая идея, но опять таки, на мой взгляд, его размещение в модели товаров это не совсем корректное решение (но в принципе, допустимое, если проект не большой), т.к. в модели должна быть бизнес-логика, а Ваш функционал - это логика отображения товара на сайте. На мой взгляд, будет более корректно выделение подобной логики в отдельную сущность ProductDisplayRule - которая, будет содержать данные по правилам отображения товара на сайте, и использоваться в остальных частях системы
Ответ написан
Комментировать
@BorisKorobkov
Web developer
Однозначно RBAC.
А уже вариантов есть много. Например,
Права 1го уровня: "смотреть", "создавать", "редактировать", "кастомизировать дешевый" (в bizRule проверять признак "самый дешевый"), "кастомизировать недешевый", "удалять".
Права 2го уровня: "неавторизованный посетитель", "авторизованный покупатель", "менеджер", "админ".
Признак "самый дешевый" хранить в БД у товара. При изменении любой цены пересчитывать все эти признаки.
В контроллере: вызвать hasAccess с параметром ID товара.
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Реализовать с помощью RBAC в виде пермишенов - гибко и удобно
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы