Ruslan
https://gist.github.com/vanilevsky/afe2c0e8113e3f6365af012c55de3107 значит тут добавь условие или
Vladimir
Ruslan
не костыль
Vladimir
не костыль
Смысл правила в проверке на авторство, а мы туда ещё условие на админа положим. Похоже на костыль 🤔
Ruslan
Проверка на право редактировать
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Не надо ничего лишнего в коде писать, просто правильно иерархию разрешений/ролей построить
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Если админ есть, то у него в потомках на любом из уровней есть право редактировать новость
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Если нет, то он не админ и права такого у него нет
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Тач тупит, ссори
Vladimir
Админ есть, но он наследует редактирование с проверкой
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Он должен наследовать разрешение
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Т.е. у роли админ есть потомок автор у которого есть в разрешениях редактировать новость
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
тут костыль)
Ruslan
это не решает его проблему
Vladimir
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
это оригинальный код?
Vladimir
Но у админа должно быть без проверки авторства
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
запилите два пермишна, полный и ограниченный
Ruslan
либо везде писать Yii::$app->user->can('updateOwnNews', ['article' => $model]) || Yii::$app->user->can('admin') либо в самом разрешении на редактирование прописать либо автор либо админ
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
и проверяйте
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
пермишн canUpdateNews
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
а в updateOwnNews все верно написано
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
либо на уровне выше
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
сути не меняет
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
updateOwnNews ограниченный доступ
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
должен быть доступ выше, который и надо проверять
Vladimir
пермишн canUpdateNews
Тоже так придумал, но значит updateOwnNews конечное правило, и его не расширить без проверки?
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
в любом случае есть canUpdateNews - пропустить, нет - проверять есть ли updateOwnNews. Просто по логике
Ruslan
хз, создавать на каждый чих для админа отдельные правила, если это все будет большой проект и управление правами будет через админку, будет список запросов в базу на проверку прав на каждое разрешение. Если он админ то у него права на все и создавать отдельные правила для него canUpdateNews canUpdateComment canUpdatePost canUpdateMessage нет ни какого смысла
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
А у редактировать уже должно быть право редактировать только свое
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Дело не в пчихе, если есть ограниченный доступ он должен наследоваться от того кто может больше
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
В будущем могут быть модераторы не админы, которые могут редактировать все новости и т.д.
Ruslan
Когда у тебя система ролей, да, так будет лучше. Когда у тебя 1-2 роли, смысла в этом нет. Создаешь роль манагер и даешь ему права на редактирование всего, и его добавляешь к правам админа. Разрешение это лишнее усложнение для нескольких ролей
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Ruslan
само собой
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
The Ant
да никто страдать не будет. Наследование это тоже проблемы
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
из разряда - "сам долбоеб"
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
в любом случае это иерархия, даже если у тебя обособенный набор разрешений не связных между собой
The Ant
нет, эта иерархия тока у тебя в голове, и возможно для некоторых удобств.
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
твои проблемы, живи с этим)
The Ant
к примеру. тебе срочно нада сделать кастомную роль со своими наборами правил. Ок. взял накликал разрешения. А потом начинаешься мучица придумывая кто от кого наследуется
The Ant
хотя для предопределенных нескольких ролей наследование вполне себе отлично смотрится. Типа: читатель, автор, модер, админ. Если за рамки этого набора не выходить.
Anonymous
Vladimir
@HunterKaan @rus72ru спасибо! Дали пищи для размышлений)
Anonymous
Объясните мне, безграмотному, пожалуйста. Вот я беру и в конструктор контроллера вставляю некий blogService. Благодаря di он автоматически подтянется и создаст обьект с этим классом. Это понятно.
Собственно, вопрос. А если уже внутри этого blogService также имеется конструктор в который подтягивается некий blogRepository и он описан в секции use класса blogService, то он также автоматически его создаст, благодаря di? То есть отдельно настраивать в bootstrap его не нужно?
Если я правильно понимаю, то настройка di требуется лишь в случае, когда неоднозначно понятно какой класс фреймворку подтягивать? ( Ну например дня случая, когда в качестве типа указан интерфейс).
Поправьте меня, пожалуйста, если заблуждаюсь.
Alexey
Это называется autowiring
Alexey
Настройка нужна если сервис должен быть, например, синглтоном. Или инстанс сервиса требует доп конфигурации.
Anonymous
+
Alexey
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
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Как пример реализации
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
Так, модуль пилишь, контроллер и действия для контроллеров если хочется отдельными классами. В этом есть смысл если использовать одинаковые действия в разных контроллерах
Anonymous
Дмитрий
☕️ 𝕽𝖔𝖈𝖐𝖊𝖙𝕽𝖆𝖈𝖈𝖔𝖔𝖓
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
Borisov
у тебя что $arr1, что $arr2 могут быть экземплярами различных классов
Eugene
Borisov
это был не вопрос :D естественно он будет ругаться, когда свойство(атрибут) не находит