Маршрут к нескольким подпапкам в CodeIgniter

У меня есть папка администратора, настроенная в моем каталоге контроллеров, в то время как у меня есть 3 отдельных подпапки с контроллерами внутри них.

-- Controllers ---- Admin ------ Dashboard -------- dashboard.php -------- file.php ------ Members -------- members.php -------- file.php ------ Settings -------- settings.php -------- file.php 

Я попытался маршрутизировать его в файле route.php, как это

 $route['admin/(:any)/(:any)'] = 'admin/$1/$2'; $route['admin/(:any)'] = 'admin/$1/$1'; $route['admin'] = 'admin/index'; 

Что мне делать, чтобы исправить это?

«Вне коробки» codeigniter не поддерживает несколько уровней подкаталогов в вашем каталоге контроллеров, всего один.

Существует способ расширить класс маршрутизации для поддержки этого, проверьте эту запись в блоге.

Этот код уже был в Интернете, но я изменил его, чтобы он работал для codeigniter 2.1

См. Старый источник здесь: http://glennpratama.wordpress.com/2009/10/20/multi-level-subfolder-for-controller-in-codeigniter/

Создайте новый файл MY_Router.php в каталоге application / core, скопируйте в него следующий код:

 <?php /* * Custom router function v 0.2 * * Add functionality : read into more than one sub-folder * */ Class MY_Router extends CI_Router { Function MY_Router() { parent::__construct(); } function _validate_request($segments) { if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) { return $segments; } if (is_dir(APPPATH.'controllers/'.$segments[0])) { $this->set_directory($segments[0]); $segments = array_slice($segments, 1); /* ----------- ADDED CODE ------------ */ while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) { // Set the directory and remove it from the segment array //$this->set_directory($this->directory . $segments[0]); if (substr($this->directory, -1, 1) == '/') $this->directory = $this->directory . $segments[0]; else $this->directory = $this->directory . '/' . $segments[0]; $segments = array_slice($segments, 1); } if (substr($this->directory, -1, 1) != '/') $this->directory = $this->directory . '/'; /* ----------- END ------------ */ if (count($segments) > 0) { if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].EXT)) { show_404($this->fetch_directory().$segments[0]); } } else { $this->set_class($this->default_controller); $this->set_method('index'); if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.EXT)) { $this->directory = ''; return array(); } } return $segments; } show_404($segments[0]); } } 

Для совместимости с Codeigniter 3.x: использование константы EXT было устаревшим с момента отказа от поддержки PHP 4. Теперь больше нет необходимости поддерживать разные расширения имен файлов, а в этой новой версии CodeIgniter (3.x) константа EXT была удален. Вместо этого используйте только «.php».

Итак, новый MY_Router.php:

 <?php /* * Custom router function v 0.3 * * Add functionality : read into more than one sub-folder * Compatible with Codeigniter 3.x * */ Class MY_Router extends CI_Router { Function MY_Router() { parent::__construct(); } function _validate_request($segments) { if (file_exists(APPPATH.'controllers/'.$segments[0].".php")) { return $segments; } if (is_dir(APPPATH.'controllers/'.$segments[0])) { $this->set_directory($segments[0]); $segments = array_slice($segments, 1); /* ----------- ADDED CODE ------------ */ while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) { // Set the directory and remove it from the segment array //$this->set_directory($this->directory . $segments[0]); if (substr($this->directory, -1, 1) == '/') $this->directory = $this->directory . $segments[0]; else $this->directory = $this->directory . '/' . $segments[0]; $segments = array_slice($segments, 1); } if (substr($this->directory, -1, 1) != '/') $this->directory = $this->directory . '/'; /* ----------- END ------------ */ if (count($segments) > 0) { if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/'.$segments[0].".php")) { show_404($this->fetch_directory().$segments[0]); } } else { $this->set_class($this->default_controller); $this->set_method('index'); if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().'/' .$this->default_controller.".php")) { $this->directory = ''; return array(); } } return $segments; } show_404($segments[0]); } } 

Я столкнулся с проблемой с 4-5 levels sub-directories (например, / controllers / folder1 / folder2 / folder3 / folder4 / my-controller) и изменить цикл while из

 while(count($segments) > 0 && // checks only $this->directory having a / is_dir(APPPATH.'controllers/'.$this->directory.$segments[0])) 

в

 while(count($segments) > 0 && // check $this->directory having a / (is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) || // check $this->directory not having / is_dir(APPPATH.'controllers/'.$this->directory.'/'.$segments[0]))) 

Меня устраивает.

Вышеприведенный вариант подходит для 2-3 sub-directories но не для иерархии 4-5 sub-directory .