Класс, содержащий только константы. Хорошо или плохо.

Adelf

Administrator
Команда форума
По здравому смыслу он пишет классы, в которых только константы, например.
У меня на одном прокте был класс Permission который содержал только константы всех возможных прав ('user.create', etc) и оно юзалось там где эти права резолвились и там, где спрашивали, разрешено что-то или нет. Не плодить же магические строки по всему проекту. В чем проблема класса с константами?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
У меня на одном прокте был класс Permission который содержал только константы всех возможных прав ('user.create', etc) и оно юзалось там где эти права резолвились и там, где спрашивали, разрешено что-то или нет. Не плодить же магические строки по всему проекту. В чем проблема класса с константами?
Проблема хардкода в поддержке и развитии. Система пермиссий имеет свойство изменяться. Она почти всегда меняется со временем, во всех проектах. Править код приложения для добавления роли - так себе идея.

1. Аутентификация. У тебя есть аккаунты, которые где-то учитываются. Юзер прошел аутентификацию. В маленьком проекте это логин, в enterprize это аутентификация через сторонний сервис.
2. Авторизация. В небольшом проекте обычно реализуется в некоторой форме RBAC. Это реакция на внешнее событие - значит, есть объект пользователь, и есть сервис, который выполняет авторизацию. Константы не нужны.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
какая такая RBAC :p
PHP:
return $user === 'йода' && $pass === 'джидай';
 

Adelf

Administrator
Команда форума
@grigori, не всем нужна система авторизации с хранением всех пермишенов, ролей, etc в базе, с админкой для них же. Для большинства проектов это пушкой по воробьям. И реализовывать такое там, где не надо, крайне вредная затея.
 

MiksIr

miksir@home:~$
2. Авторизация. В небольшом проекте обычно реализуется в некоторой форме RBAC. Это реакция на внешнее событие - значит, есть объект пользователь, и есть сервис, который выполняет авторизацию. Константы не нужны.
Все-равно у тебя какие-то проверки в коде остаются. Проверки на права, присущие роли. И их можно задавать константами. Хотя бы потому, что автокомплит, а в строчке можно ошибиться.
 

WMix

герр M:)ller
Партнер клуба
@MiksIr, не не обязательно, все может быть в базе по табличкам раскидано, но где enum там на мой взгдяд константа самое простое.
 

WMix

герр M:)ller
Партнер клуба
у тебя же нет констант для пользователей...
таблички users, roles, userroles, routes, roleroute... погляди rbac все в базе
проверка $route->isAllowed() или чтот в этом роде, но если правильно собрать будет 403 или 404 без проверок
 

MiksIr

miksir@home:~$
Понятно о чем ты. Ну не всегда возможно ограничиться роутами. И даже если с роутами, берем задачу - отображение состояния на основе прав (ну, банально кнопку отрисовать), придется в этом месте хардкорить имя роута, что бы получить это. Хотя я больше про случаи, когда acl дает набор прав типа can_delete, и в коде мы проверяем if ( ... "can_delete" )
 

Вурдалак

Продвинутый новичок
у тебя же нет констант для пользователей...
таблички users, roles, userroles, routes, roleroute... погляди rbac все в базе
проверка $route->isAllowed() или чтот в этом роде, но если правильно собрать будет 403 или 404 без проверок
Кручу-верчу, обмануть хочу? Ты заменил понятие permission на route name, я ничего не путаю?
 

WMix

герр M:)ller
Партнер клуба
Писал от винта как помню, рбак я еще год назад тут на форуме описывал, и да пермишины были, но да разве это релевантно? Permissions это связка ролей на руты, у меня руты кажись рессурсами звались
 

Вурдалак

Продвинутый новичок
Писал от винта как помню, рбак я еще год назад тут на форуме описывал, и да пермишины были, но да разве это релевантно? Permissions это связка ролей на руты, у меня руты кажись рессурсами звались
Ты так и не ушёл от констант: теперь у тебя это route name.

Есть фича — «изменить имя». Эта фича должна быть кем-то написана, таких людей называют программистами. Чтобы менеджер мог из админки предоставить доступ к фиче, он каким-то образом должен установить взаимосвязь между фичей и ролью (или пользователем). Чтобы установить эту взаимосвязь, ему нужен идентификатор роли/пользователя и идентификатор фичи в явном или неявном виде: «rename_user», permission «rename_user», route name («POST /user/.../rename»), etc. Этот идентификатор хардкодится в коде.
 

WMix

герр M:)ller
Партнер клуба
Имя руты или ид или паттерн это все аттрибуты, чтоб ответить на вопрос можно или нельзя, на уровне представления это совем побоку. На уровне модели это стравнить два значения, то что актуально и так как это настроенно, при этом второе это простой сквоздной джоин от пользователя до ресурса
 

Вурдалак

Продвинутый новичок
Имя руты или ид или паттерн это все аттрибуты, чтоб ответить на вопрос можно или нельзя, на уровне представления это совем побоку. На уровне модели это стравнить два значения, то что актуально и так как это настроенно, при этом второе это простой сквоздной джоин от пользователя до ресурса
Ты со своим полётом мысли, кажется, улетел от этой темы далеко-далеко.
 

WMix

герр M:)ller
Партнер клуба
Ты со своим полётом мысли, кажется, улетел от этой темы далеко-далеко.
когда сравниваешь два значения пофигу какие там данные и необязательго их описывать константами, они меняются по клику на фронтэнде, когда джойнишь ты называешь имена полей а не их значения. Какой ответ еще ты хочешь?
 

Вурдалак

Продвинутый новичок
Какой ответ еще ты хочешь?
Посмотри на цепочку обсуждения: речь шла о том, что есть некие константы, они есть, от них не уйти, их нужно где-то описать.
Что предложил ты?
Продублировать константы в базе.
Это невероятное решение. Которое, безусловно, не избавляет от самих констант, которые по-прежнему где-то должны быть в коде.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Согласен с вами, я сделал некорректное обобщение. Делать ли RBAC, меняется ли система пермиссий - зависит от потребностей проекта.
Бывает удобно сделать список констант для обозначения ролей. Эти константы можно описать в классе сущности или в интерфейсе, выносить их в пустой класс смысла нет.

когда acl дает набор прав типа can_delete, и в коде мы проверяем if ( ... "can_delete" )
Я бы это написал как $ACL->canDelete($User).

есть некие константы, они есть, от них не уйти, их нужно где-то описать.
Константы можно инкапсулировать и скрыть за интерфейсом. Действия программируются кодом приложения, в "хардкоде" названий действий проблемы нет.
А роли и права можно вынести в ini-файл, и править, если возникнет надобность.

- компания Zfort (grigori наверно слышал про нее), общение с HR было приятное как по скайпу, так и при встрече, но вот общение с тимлидом мне не понравилось, через 30 минут я только и думал как бы уйти побыстрей, проблемы начались с вопроса "напиши мне функцию, которая реализует ***", я написал три варианта, он мне говорил, каждые раз, что лучше, но это не то, после третьего раза, я сдался, тогда он стал требовать, что бы я повторил задание, я повторил суть задания, но снова ответ был неправильный, в итоге он сказал, что я невнимательный и даже задание не могу запомнить, как выяснилось, моя ошибка была в том, что я алгоритм не взяли в function NAME() {} , так как задание было написать функцию, которая выполняет ***, потом были еще подобные "вопросы", правильных ответом он не давал;
да, они недавно общались со мной насчет позиции CTO :)
Думаю, у тебя было стресс-тестирование. У меня было то же самое, но троллить на тему php они не стали, поэтому позадрачивали насчет диплома
- почему вы не оформили IT как свою основную сферу деятельности?
- я много лет официально работаю в сфере IT
- я имею ввиду образование - почему вы не получили диплом в сфере IT?
- не вижу, зачем мне нужен второй диплом
- в крупных корпорациях обращают внимание на образование
(открываю 1ю страницу резюме с текущим местом работы - крупная международная корпорация, развожу руками)
- но если вы захотите уехать в другую страну, диплом может быть важен?
- я не хочу уезжать в другую страну
- заказчики иногда просят специалистов из конкретного ВУЗа
- да, запросы бывают самые разные, подо всех не подстроиться
понял, что диалог бесконечен, и сказал, что если диплом, который получен 20 лет назад, важнее, чем то, чем я занимаюсь последние 20 лет - вероятно, это не та компания, в которой я хочу работать, но если он мне будет нужен - я его куплю

особо не расстраивайся, их специализация - drupal, на любителя
 

WMix

герр M:)ller
Партнер клуба
Посмотри на цепочку обсуждения: речь шла о том, что есть некие константы, они есть, от них не уйти, их нужно где-то описать.
Что предложил ты?
Продублировать константы в базе.
Это невероятное решение. Которое, безусловно, не избавляет от самих констант, которые по-прежнему где-то должны быть в коде.
Ты сейчас о каких константах? Название роли это имя которое придумал пользователь (админ) ореентируешься на индефикаторы и на связки. Вся симантика лежит в джоине и значении наль/ не наль для заданного ресурса-пользователя.
 
Сверху