Маршрут к нескольким вложенным папкам в CodeIgniter
У меня в каталоге контроллеров настроена папка администратора, в которой у меня есть 3 отдельные подпапки с контроллерами внутри них.
-- Controllers
---- Admin
------ Dashboard
-------- dashboard.php
-------- file.php
------ Members
-------- members.php
-------- file.php
------ Settings
-------- settings.php
-------- file.php
Я попытался направить его в routes.php файл, подобный этому
$route['admin/(:any)/(:any)'] = 'admin/$1/$2';
$route['admin/(:any)'] = 'admin/$1/$1';
$route['admin'] = 'admin/index';
Что мне сделать, чтобы исправить это?
4 answers
"Из коробки" 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
(например, /контроллеры/папка 1/папка 2/папка3/папка 4/мой-контроллер) и изменил цикл 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
.