Vladimir
updateOwnNews добавь в дочерние админу
Он дочерний к менеджеру, а менеджер к админу.
Ruslan
https://gist.github.com/vanilevsky/afe2c0e8113e3f6365af012c55de3107 значит тут добавь условие или
Vladimir
updateOwnNews добавь в дочерние админу
Получается, при наследовании к админу тоже условие на авторство проверяется
Ruslan
не костыль
Vladimir
не костыль
Смысл правила в проверке на авторство, а мы туда ещё условие на админа положим. Похоже на костыль 🤔
Ruslan
Проверка на право редактировать
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Не надо ничего лишнего в коде писать, просто правильно иерархию разрешений/ролей построить
Vladimir
Не надо ничего лишнего в коде писать, просто правильно иерархию разрешений/ролей построить
Вот именно, но тогда при наследовании от админа сохраняется условие проверки на авторство
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Если админ есть, то у него в потомках на любом из уровней есть право редактировать новость
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Если нет, то он не админ и права такого у него нет
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Тач тупит, ссори
Vladimir
Админ есть, но он наследует редактирование с проверкой
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Он должен наследовать разрешение
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Т.е. у роли админ есть потомок автор у которого есть в разрешениях редактировать новость
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
тут костыль)
Ruslan
это не решает его проблему
Vladimir
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
это оригинальный код?
Vladimir
Но у админа должно быть без проверки авторства
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
запилите два пермишна, полный и ограниченный
Ruslan
либо везде писать Yii::$app->user->can('updateOwnNews', ['article' => $model]) || Yii::$app->user->can('admin') либо в самом разрешении на редактирование прописать либо автор либо админ
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
и проверяйте
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
пермишн canUpdateNews
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
а в updateOwnNews все верно написано
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
либо на уровне выше
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
сути не меняет
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
updateOwnNews ограниченный доступ
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
должен быть доступ выше, который и надо проверять
Vladimir
пермишн canUpdateNews
Тоже так придумал, но значит updateOwnNews конечное правило, и его не расширить без проверки?
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Тоже так придумал, но значит updateOwnNews конечное правило, и его не расширить без проверки?
это обычныый checkAccess, к примеру нет доступа - проверяем есть ли ограниченный доступ и авторство
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
в любом случае есть canUpdateNews - пропустить, нет - проверять есть ли updateOwnNews. Просто по логике
Ruslan
хз, создавать на каждый чих для админа отдельные правила, если это все будет большой проект и управление правами будет через админку, будет список запросов в базу на проверку прав на каждое разрешение. Если он админ то у него права на все и создавать отдельные правила для него canUpdateNews canUpdateComment canUpdatePost canUpdateMessage нет ни какого смысла
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
А у редактировать уже должно быть право редактировать только свое
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Дело не в пчихе, если есть ограниченный доступ он должен наследоваться от того кто может больше
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
В будущем могут быть модераторы не админы, которые могут редактировать все новости и т.д.
Ruslan
Когда у тебя система ролей, да, так будет лучше. Когда у тебя 1-2 роли, смысла в этом нет. Создаешь роль манагер и даешь ему права на редактирование всего, и его добавляешь к правам админа. Разрешение это лишнее усложнение для нескольких ролей
Ruslan
само собой
The Ant
Дело не в пчихе, если есть ограниченный доступ он должен наследоваться от того кто может больше
никто никому не должен. это одна из реализаций, исключительно под задачи. Хочешь, делай чтоб наследовалось, хочешь, делай чтоб роли были самостоятельным набором правил и разрешений.
The Ant
да никто страдать не будет. Наследование это тоже проблемы
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
из разряда - "сам долбоеб"
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
в любом случае это иерархия, даже если у тебя обособенный набор разрешений не связных между собой
The Ant
нет, эта иерархия тока у тебя в голове, и возможно для некоторых удобств.
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
твои проблемы, живи с этим)
The Ant
к примеру. тебе срочно нада сделать кастомную роль со своими наборами правил. Ок. взял накликал разрешения. А потом начинаешься мучица придумывая кто от кого наследуется
The Ant
хотя для предопределенных нескольких ролей наследование вполне себе отлично смотрится. Типа: читатель, автор, модер, админ. Если за рамки этого набора не выходить.
Vladimir
@HunterKaan @rus72ru спасибо! Дали пищи для размышлений)
Anonymous
Объясните мне, безграмотному, пожалуйста. Вот я беру и в конструктор контроллера вставляю некий blogService. Благодаря di он автоматически подтянется и создаст обьект с этим классом. Это понятно. Собственно, вопрос. А если уже внутри этого blogService также имеется конструктор в который подтягивается некий blogRepository и он описан в секции use класса blogService, то он также автоматически его создаст, благодаря di? То есть отдельно настраивать в bootstrap его не нужно? Если я правильно понимаю, то настройка di требуется лишь в случае, когда неоднозначно понятно какой класс фреймворку подтягивать? ( Ну например дня случая, когда в качестве типа указан интерфейс). Поправьте меня, пожалуйста, если заблуждаюсь.
Alexey
Это называется autowiring
Alexey
Настройка нужна если сервис должен быть, например, синглтоном. Или инстанс сервиса требует доп конфигурации.
Anonymous
+
Anonymous
Настройка нужна если сервис должен быть, например, синглтоном. Или инстанс сервиса требует доп конфигурации.
А какая, например, может потребоваться конфигурация? Приведите пример. Передача дополнительных переменных/значений/ классов? Вы это имеете в виду?
Anonymous
И еще небольшой вопрос по di. Я хочу разобраться правильно ли тут будет его применение. Допустим, я хочу настроить и использовать несколько сервисов рассылки смс сообщений. Причем, какой-то сервис я беру за основной, а остальные как резервные. Где-то в недрах идет вызов этого главного сервиса смс путем запроса из БД какой из них использовать. (Подразумевается, что все мои сервисы имеют общий интерфейс). И уже, получая из БД имя класса я создаю этот объект через createObject, например. Вот такое решение, что я описал это и есть один из распространенных случаев использования di? Правда, в данном конкретном случае может использование di не совсем оправдано? Достаточно просто создать класс с его именем, полученным из БД? Значит, возможно этот запрос можно сделать из bootstrap каким-то образом? Тот же синглтон, наверно нужен будет. Ведь сервис один на протяжении всего цикла приложения. В общем, запутался немного.
Alexey
di тут не очень применим
Alexey
мы просто в очередь сообщений писали, через какой шлюз сообщение должно быть отправлено https://github.com/yii-dream-team/yii2-sms-center/tree/master/src
Alexey
Alexey
вот пример типичного использования DI
Ruslan
Кто то делал api в таком формате? https://github.com/DmitryKorobko/BigBiz/tree/c0c7a6f2b2cfcf25c72f3764db23fe557a116c0a/rest/modules/api/v1 1. Все сгруппировано по модулям (suport, shop, product,content) 2. Для каждого action создается отдельный класc со своими параметрами, поведением и логикой
Ruslan
ActiveController в рест?
вопрос о структуре
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Как пример реализации
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Так, модуль пилишь, контроллер и действия для контроллеров если хочется отдельными классами. В этом есть смысл если использовать одинаковые действия в разных контроллерах
Eugene
ребята, как отсортировать массив после array_merge? пытаюсь использоваться что то типа usort($model, function($arr1, $arr2) { if ($arr1['news_date'] == $arr2['cdate_int']) return 0; return $arr1['news_date'] > $arr2['cdate_int'] ? 1 : -1; }); и постоянно получаю ошибку Getting unknown property: ***\***\news\***\News::news_date тут суть в том, что блин он свойство одного массива пытается найти в другом и крашится, как правильно делать?
Дмитрий
Чет, код какая то херня
Anton
+
Anton
вообще не понятно что это и зачем
Borisov
у тебя что $arr1, что $arr2 могут быть экземплярами различных классов
Borisov
это был не вопрос :D естественно он будет ругаться, когда свойство(атрибут) не находит