Я хочу создать аутентификацию пользователя с уровнем доступа для моего сайта. Я хочу получить и перечислить все имя класса контроллера для создания группы пользователей.
Заранее спасибо,
логан
Для этого лучше всего их записать в новый файл конфигурации.
$config['controllers'] = array( 'blog', 'events', 'news', // etc. );
В противном случае вы будете сканировать каталоги, которые будут потреблять ресурсы. Но вы можете сделать это так:
$controllers = array(); $this->load->helper('file'); // Scan files in the /application/controllers directory // Set the second param to TRUE or remove it if you // don't have controllers in sub directories $files = get_dir_file_info(APPPATH.'controllers', FALSE); // Loop through file names removing .php extension foreach (array_keys($files) as $file) { $controllers[] = str_replace(EXT, '', $file); } print_r($controllers); // Array with all our controllers
Поскольку имена файлов соответствуют именам контроллеров, теперь у вас должен быть массив всех ваших контроллеров. Это не идеально, хотя по нескольким причинам, но должно работать для большинства настроек.
Лично я использую сильно измененную структуру каталогов, поэтому это не сработает для меня, и некоторые контроллеры, которых я тоже хотел бы игнорировать. Другой вариант – кэшировать результаты в файл, но это отдельный учебник.
Я настоятельно рекомендую определить их в конфигурационном файле, таким образом вы можете хранить другую полезную информацию, напрямую связанную с вашим контролем доступа, и избегать огромных накладных расходов на каталоги рекурсивно сканирующих.
Другой способ заключается в том, что вы можете это сделать, создав интерфейс, который вы можете проверить в своей системе аутентификации, например, создайте класс следующим образом:
interface IAuthorizationRequired { public function __auth(); }
Теперь создайте свой контроллер (псевдо)
class BlogController extends CI_Controller implements IAuthorizationRequired { public function __auth() { /*Redirect or Custom*/ } }
и в вашем модуле авторизации вы загружаете текущий контроллер и выполняете следующее:
if(($controller instanceof IAuthorizationRequired) && method_exists(array($controller,'__auth'))) { $authed = $controller->__auth(); if(!$authed) { echo 'Authorization Failed'; exit; } }
В пределах 2.0 вы можете переопределить базовый контроллер и добавить к нему метод __auth, а затем просто проверить интерфейс и запустить auth.