我将开始新的Codeigniter应用程序并尝试找到一种方法将第三方模块源(例如Tank Auth)与我自己的代码分开, 我需要的是设置如下文件树:
/ /application
/site
使用index.php
和application/config/config.php
设置完成了。
使用配置设置有没有正确的方法来实现上面的树?我是Codeigniter的新手,并且不知道这是否可能。
答案 0 :(得分:3)
对于具有Codeigniter的模块化结构,模块化扩展 - HMVC 是首选解决方案:
https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc
对于您的设置,您可以将其添加到config.php
:
$config['modules_locations'] = array(
// absolute path relative path
APPPATH.'3rd_party/application/' => '../../3rd_party/application/',
);
"相对路径"相对于应用程序根目录中的任何子目录,例如models
,controllers
,helpers
等。例如,在CI中,您可以加载"模型"从一个"视图"目录,如果您使用:
$this->load->model('../views/some_model');
......不是你通常会做的事情 - 但这就是HMVC的装载机的工作方式。 HVMC可用于加载通常可以通过"模块"目录。您可以根据需要使用多个不同的模块或模块路径。
模块可以(但不必)加载控制器并像他们自己的迷你应用程序一样工作。您还可以跨模块或从默认应用程序根加载依赖项。 您仍然可以将默认应用程序目录与模块一起使用。要指定您要从模块路径加载特定资产,只需在路径中包含模块名称:
// Loads the "tank_auth" library (works from the tank_auth module)
$this->load->library('tank_auth');
// Loads the "tank_auth" library (works from anywhere in your application)
$this->load->library('tank_auth/tank_auth');
这也适用于模特,助手等。
要访问tank_auth/controllers/login
中的控制器,您可以使用网址http://example.com/tank_auth/login
。您还可以使用modules::run()
方法在另一个控制器中运行控制器,这样您就可以使用#34; wrap"模块的控制器方法在你自己的逻辑中没有触及它们:
class my_login extends MX_Controller {
function index() {
modules::run('tank_auth/login');
}
}
它有很好的记录,已存在多年。我几乎在我曾经做过的所有Codeigniter项目中都使用过HMVC,我强烈推荐它。
答案 1 :(得分:0)
问题是使用$this->load->library("path/to/module")
加载库的loader class使用硬编码的“库”作为文件夹名称(check the source of Loader.php)。因此,换句话说,所有模块和库都必须驻留在库文件夹
/ project_root /
- / system(框架系统 - 完成)
- /库/
- / 3rd_party中/
- /应用/
然后用$this->load->library('3rd_party/application/tankh_auth.php
)`
纠正此问题(而不使用库文件夹)的唯一方法是通过writing your own覆盖Loader类。通过覆盖库方法,在application
文件夹中创建Loader.php,具体为 - application/core
class My_Loader extends CI_Loader {
function __construct() {
parent::__construct();
}
public function library($library = '', $params = NULL, $object_name = NULL){
//override this method with your custom loader code
//eg
include_once($filepath."/".$library); //where your $filepath is path to your library,
$this->_ci_loaded_files[] = $filepath;
return $this->_ci_init_class($class, '', $params, $object_name);
//again look at original methods and/or write your own by referencing those
}
}
答案 2 :(得分:0)
您不需要担心HMVC(尽管它很棒),您也不需要MY_Loader
。
我会通读http://ellislab.com/codeigniter/user-guide/libraries/loader.html - 即应用程序“包”
部分在这里,您将看到一个名为
的方法$this->load->add_package_path()
您可以在其中为加载程序指定其他路径来查找库。