Как перечислить все имена классов контроллеров в codeigniter?

#php #codeigniter

#php #codeigniter

Вопрос:

Я хочу создать аутентификацию пользователя с уровнем доступа для серверной части моего сайта. Я хочу получить и перечислить все имена классов контроллеров для создания группы пользователей.

Заранее спасибо,

Логан

Ответ №1:

Для этого лучше всего явно записать их в новый конфигурационный файл.

 $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
  

Поскольку имена файлов совпадают с именами контроллеров, теперь у вас должен быть массив всех ваших контроллеров. Это не идеально, хотя по нескольким причинам, но должно работать для большинства настроек.

Лично я использую сильно измененную структуру каталогов, так что у меня это не сработало бы, и некоторые контроллеры я бы тоже хотел игнорировать. Другим вариантом было бы кэшировать результаты в файл, но это отдельный учебник.

Я настоятельно рекомендую определить их в файле конфигурации, таким образом, вы можете хранить другую полезную информацию, непосредственно связанную с вашим контролем доступа, и избежать огромных накладных расходов на рекурсивное сканирование каталогов.

Ответ №2:

Другой способ, которым вы могли бы это сделать, — создать интерфейс, который вы затем можете проверить в своей системе аутентификации, например, создать класс, подобный so:

 interface IAuthorizationRequired
{
     public function __auth();
}
  

Теперь создайте свой контроллер (псевдо)

 class BlogController extends CI_Controller implements IAuthorizationRequired
{
     public function __auth()
     {
          /*Redirect or Custom*/
     }
}
  

и в вашем модуле авторизации вы загружаете текущий контроллер и выполняете последующее:

 if(($controller instanceof IAuthorizationRequired) amp;amp; method_exists(array($controller,'__auth')))
{
     $authed = $controller->__auth();
     if(!$authed)
     {
         echo 'Authorization Failed';
         exit;
     }
}
  

В версии 2.0 вы можете переопределить базовый контроллер и добавить к нему свой метод __auth, а затем просто проверить интерфейс и запустить аутентификацию.