#php #kohana #kohana-3
#php #kohana #kohana-3
Вопрос:
Я новичок в разработке приложений на PHP / Kohana.
В веб-приложении, которое я разрабатываю, всякий раз, когда на контроллер поступает новый запрос, я должен проверить, вошел ли пользователь в систему или у него достаточно привилегий для совершения запрошенного им действия. Поскольку мое приложение имеет разные категории участников (с разной степенью полномочий), каждый метод контроллера в конечном итоге имеет множество ветвей if / else. код повторяется и в других методах контроллера.
Есть ли какой-либо предлагаемый способ централизовать эти вызовы и избежать повторения кода? Я имею в виду, это единственный способ добиться этого, написав метод, охватывающий весь код сеанса пользователя? или мне не хватает какой-либо функциональности, которая встроена в PHP / Kohana, которая уже работает с этим сценарием?
например:-
if (Auth::instance()->logged_in('commentator')) {
// do something here.
}
else if (Auth:instance()->logged_in('admin')){
// do something here.
}
else if (Auth:instance()->logged_in('reviewer')){
// do something here.
}
Комментарии:
1. Значит, разные группы используют одни и те же методы и контроллеры? Если это так, вам всегда придется выполнять проверку только из-за дизайна. Почему бы не позволить разным контроллерам обрабатывать разные группы?
2. Вы предполагаете, что у вас есть главный контроллер, и этот маршрут основного контроллера вызывает дополнительные контроллеры после проверки роли? в таком случае, должен ли я также иметь разные файлы просмотра для обслуживания разных пользователей?
3. Здесь это может иметь смысл, да. Также используйте наследование, поэтому вам нужно написать как можно меньше кода. Все зависит от того, насколько сильно отличаются действия. Это не должно касаться представлений, поскольку они не должны беспокоиться о том, кто их зачем вызывает, а просто хорошо выглядеть 😉 Я подумаю об этом подробнее и смогу дать вам сложный ответ сегодня вечером
Ответ №1:
Создайте контроллер с именем Controller_Authenticated
с некоторым кодом, подобным этому:
protected $login_level;
public function before()
{
parent::before();
if (Auth::instance()->logged_in('commentator')) {
$this->login_level = 'commentator';
}
elseif (Auth:instance()->logged_in('admin')){
$this->login_level = 'admin';
}
elseif (Auth:instance()->logged_in('reviewer')){
$this->login_level = 'reviewer';
}
else {
// Redirect to login page here, or display a "you are not logged in" message
}
}
Затем попросите другие ваши контроллеры расширить Controller_Authenticated
вместо just Controller
. Затем вы можете проверить значение parent::$login_level
, чтобы узнать, что это за пользователь.
Таким образом, весь ваш код проверки входа в систему находится в одном месте, а проверка того, что вы за пользователь, выполняется автоматически при загрузке контроллера (до вызова действия).
В документации Kohana есть почти точно такой пример использования before
метода для обработки данных входа в систему.
Комментарии:
1. Если вы расширяете
Controller_Template
, например, важно сначала вызватьparent::before();
свой собственный метод2. Поскольку
parent::before
в любом случае не помешает вызвать вызов, я добавил его в свой пример.