Php CodeIgniter无法同时处理控制器和视图的多级子文件夹
我在使用smarty模板的Codeigniter中工作 问题是,如果我转到视图或控制器中的第二个子文件夹,Codeigniter将停止工作 这里是e-gPhp CodeIgniter无法同时处理控制器和视图的多级子文件夹,php,codeigniter,smarty,directory-structure,Php,Codeigniter,Smarty,Directory Structure,我在使用smarty模板的Codeigniter中工作 问题是,如果我转到视图或控制器中的第二个子文件夹,Codeigniter将停止工作 这里是e-g application/controllers/main.php - works application/controllers/admin/dashboard.php - works application/controllers/admin/manageUsers/ListUsers.php - not working 我在网上搜索过,
application/controllers/main.php - works
application/controllers/admin/dashboard.php - works
application/controllers/admin/manageUsers/ListUsers.php - not working
我在网上搜索过,他们说我可以使用routes,也可以使用controller
但我关心的是这些观点。。
我的意思是管理视图应该放在管理文件夹下,但我不能在管理中创建子文件夹,若我把所有视图都放在管理文件夹中,那个将是一个混乱,并没有组织。我希望你能理解我想说的话
e-g
请任何人指导我如何解决这些问题。您的问题很常见。当我开始使用CodeIgniter时,我也有过这种感觉。我发现克服它的最佳方法是创建一个
Custom_Router
,它扩展了CI_Router
类。这样做允许您覆盖控制器类include/require逻辑并允许使用subdir。这是一个工作示例:
<?php
class Custom_Router extends CI_Router
{
public function __construct()
{
parent::__construct();
}
public 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);
while(count($segments) > 0 && is_dir(APPPATH.'controllers/'.$this->directory.DIRECTORY_SEPARATOR.$segments[0]))
{
// Set the directory and remove it from the segment array
$this->directory = $this->directory . $segments[0] .DIRECTORY_SEPARATOR;
$segments = array_slice($segments, 1);
}
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]);
}
}
?>
如果Twig不是您的选项,那么您需要创建一个新类来扩展CI_加载器
类,并覆盖public function view(){}
方法
顺便说一句,如果您正在创建一个带有后端的web应用程序,那么如果您在不同的目录中分离应用程序,您可能会发现管理和维护代码会更容易。如果选择这种方式,则需要创建application/public
和application/admin
文件夹,以保存CodeIgniter“应用程序”的目录结构。以下是步骤:
/applications
-- public (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
-- admin (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
/index.php
并将$application\u文件夹更改为指向applications/public
/index.php
的副本,将其命名为backend.php
(或任何您想要的名称)。打开文件并更改$application\u文件夹
以指向applications/admin
文件夹.htaccess
并添加一条规则,将以/admin
开头的所有URI传递到backend.php
# Route admin urls
RewriteCond %{REQUEST_URI} admin([/])?(.*)
RewriteRule .* backend.php?$1 [QSA,L]
您正在使用模板库吗?查看文件的文件夹结构对我来说似乎很奇怪。在您的
管理员
控制器中,您正在执行功能管理($site\u settings,$preferences)
;您是否尝试过编辑config/route.php
文件并添加$route['admin/(.*)]='admin/$1'代码>?另一种方法是添加一个Custom_Router
,它扩展了CI_Router
,并更改require/include
逻辑。你试过了吗?
/applications
-- public (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
-- admin (a standard application directory structure)
---- cache
---- config
---- controllers
---- models
---- views
---- ...
# Route admin urls
RewriteCond %{REQUEST_URI} admin([/])?(.*)
RewriteRule .* backend.php?$1 [QSA,L]