
Roquie
08.08.2018
12:37:31
Adel Раз мы определились, что работа с ролями, это бизнес-логика, тогда слой работы с БД не должен содержать в себе такую логику. Окей.
Так-же мы имеем еще 2 слоя: слой аутентификации и сервисный слой.
Выходит, что сервис пользователей (а потом еще трех таблиц) будет делать одинаковые запросы на выборку (обращаться к репозиторию) для разных ролей? То есть 3 репозитория, которые не относятся к пользователю, будут иметь абсолютно одинаковый код на выборку :)
Хоть ты тресни, но DRY засел во мне очень плотно ))
Ну и 3 сервиса тоже будут иметь одинаковые проверки отличающиеся только объектом в рантайме ))

Adel
08.08.2018
12:40:00

Roquie
08.08.2018
12:45:35
Это я понял с первого раза. Но если таких случаев будет 20 (и все одинаковые), тогда придется как-то с этим жить ибо, если добавится новое правило для всех, будет боль обновлять все 20 случаев. Я думаю, что есть вариант другого подхода (например, от обратного), без нарушения послойного разделения приложения.

Google

Sergey
08.08.2018
13:22:39
если мы говорим про проверки доступа то они могут находиться во всех слоях
на уровне работы с базой - например что бы добавлять в условия можо тебе или нельзя иметь доступ к данным (404 вместо 403 что бы ты даже не зал о существовании того с чем тебе нельзя работать)
на уровне приложения - например простенький RBAC, на уровне бизнес логики (когда у тебя бизнес правила посложнее чем просто роль)
не зацикливайся на слоях и все будет проще. слои не важны
одна и та же "фича" может вовлекать в себя разные аспекты инфраструктуры и бизнес логики и тут все будет только о том как фичу разделить так что бы SRP соблюдалось. А оттуда уже и слои так или иначе формироваться будут
но не пытайся думать в терминах persistence layer, domain или application layer


Evgenij
08.08.2018
14:03:13

Adel
08.08.2018
14:03:21
Летят двое на воздушном шаре... Унесло их, и не знают, где они сейчас... Пролетают мимо холма, на котором сидит человек. Храбрые воздухоплаватели спрашивают его:
- Скажите, пожалуйста, где мы сейчас находимся?
Человек на холме долго думает, после чего отвечает:
- На воздушном шаре.
Более пожилой и, следовательно более умудренный опытом воздухоплаватель говорит другому:
- Этот человек на холме - математик.
- Почему же?
- Он долго раздумывал над простым вопросом, после чего дал абсолютно точный и совершенно бесполезный ответ...
Извини, Фесор :)) но это сейчас про тебя. у человека довольно точно описанная проблема. а ты сильно абстрактно описал "решение"

Sergey
08.08.2018
14:05:41
это как "валидацию данных" обощать, есть валидность пользовательского ввода, есть консистентность стэйта приложения, есть бизнес правила и бизнес логика

Google

Adel
08.08.2018
14:07:02
но он сомневается

Sergey
08.08.2018
14:07:23
и дальше описал что и как depends

Adel
08.08.2018
14:07:31
математик :)

Sergey
08.08.2018
14:07:37
может ты просто не шаришь?)
ну бля, вопрос "куда положить код" - ответ "раздели его и положи штуки в свои слои"
ну и про конкретный вопрос ты загнул - он тоже абстрактный.
я не знаю какую задачу он решает, какие роли, как оно должно работать. или ты хочешь что бы я код за него писал?
короч, ебитесь сами)

Adel
08.08.2018
14:08:44
)))

Roquie
08.08.2018
14:10:17

Adel
08.08.2018
14:12:35

Aleh
08.08.2018
14:13:18
конкретно в репозиторий логичнее критерий передавать явно

Sergey
08.08.2018
14:13:41
Кто знает роль? Кто как ее кому передает? Хочешь ли ты давать глобальный доступ к сессии или же хочешь решения принимать на уровень выше и дергать что надо у репозитория? Это можно даже декоратором сделать

Roquie
08.08.2018
14:13:44

Sergey
08.08.2018
14:14:01
Но слои тут не причем. Слои не папки, в них код не ложат

Aleh
08.08.2018
14:14:41

Google

Aleh
08.08.2018
14:16:31
только желательно быть последовательным в убеждениях и складывать прям совсем все

Roquie
08.08.2018
14:37:57

Combot
08.08.2018
14:39:06
roquie (0) увеличил репутацию Aleh Kashnikau (1)

Roquie
08.08.2018
14:39:26
о_О

Sergey
08.08.2018
14:42:11
ну то есть слишком много "а как у тебя реализовано то-то"


Roquie
08.08.2018
14:46:27
Все доступы до экшенов контроллеров ограничены с помощью authorize() в FormRequest’ах. А там ларавел сам проверяет.
Сейчас задача иного плана, не просто ограничить доступ до метода, а ограничить выборку у ряда методов, в зависимости от того, какая роль у пользователя.
Для работы с базой используется Eloquent (AR) завернутый в репозитории, чтобы было проще тестить прилогос без базы (и с этим я успешно справляюсь).
Вот спрашивается, куда запихнуть проверку ролей, когда:
1. Если они в репозиториях, тогда копипаста будет все равно (только треитами и ифами размазывать)
2.Если делать в сервисах на каждый объект репозитория, тогда ловлю ту проблему, ссылку на которую я скидывал. @Adelf32 говорит, что так норм.

Sergey
08.08.2018
14:49:57

Roquie
08.08.2018
14:51:28
Почти да. Критерии не динамические, они руками прописываются в коде.

Sergey
08.08.2018
14:52:43

Roquie
08.08.2018
14:54:06
Тут смотря что понимать, под словами “динамические критерии”. Возможно мы об одном и том-же.

Admin
ERROR: S client not available

Sergey
08.08.2018
14:55:20
where(
ownedBy(user),
premiumGoods()
)
например

Google

Roquie
08.08.2018
15:00:25
Ну как, сам запрос в базу будет делать выборку записей с ограничением по user_id и/или с доп. айдишниками пользователей которые ему принадлежат. Типичная выборка клиентов Агента в корпоративном мире. И все это зависит от определенной роли.

Adel
08.08.2018
15:01:03
ты можешь просто генерить разные обьекты-критерии. и отдавать "репозиториям"

Sergey
08.08.2018
15:02:03


Roquie
08.08.2018
15:11:51
есть такой паттерн - Specification.
Угу. В данном случае, он мало чем будет отличаться от Criteria, который часто используют вместе с Repository. Прада, если так сделать, ты туда сможешь вынести только повторяющиеся методы (запросы) в каждом репозитории. Тогда по этой части удастся избежать копипаста.
А вот по части проверки прав доступа все осталось на своих местах, с теми-же одинаковыми условиями на проверку, — какой запрос использовать в зависимости от роли.
Я уже все больше склоняюсь к тому, чтобы сделать AbstractBaseService какой-нить и вынести общий метод проверки туда и забить.

Sergey
08.08.2018
15:14:58
типа...

Roquie
08.08.2018
15:15:24

Sergey
08.08.2018
15:15:32
пока это критерии, описания, они не относятся к персистенсу. это лишь штуки которые делают внутри new SomeOtherCriteria(), new ByUser()

Roquie
08.08.2018
15:16:08
Criteria over Criteria's?
Критерия содержит в себе методы модели, чтобы сделать более узкую выборку. Методы модели и есть нечто иное, что работает с БД. Разве это не так?

Sergey
08.08.2018
15:17:59
да типа композиция критерий которая на основе входящих параметров выбирает что композировать

Roquie
08.08.2018
15:25:17
А это мысль.
Не успею я сегодня уже реализовать этот вариант, так что @Adelf32 @fes0r @mkusher спасибо за помощь :) Может чуть позже напишу о результатах.

F01134H
10.08.2018
21:09:50
Есть какой-нибудь паттерн, что то типа фабричного метода, только где конкретные фабрики возвращают не конкретный объект, а абстрактный (типо есть только один класс, который всегда возвращается этими фабриками, разница только в логике формирования этого класса)
конкретно порождающий нужен

Google

F01134H
10.08.2018
21:10:58

Артур Евгеньевич
10.08.2018
21:11:42
ты можешь в креаторе возвраащать не абстрактный класс а конкретный и даже final
тогда получится то что ты хочешь как раз

Ivan
10.08.2018
21:30:41