3

我将启动新的 Codeigniter 应用程序并尝试找到一种方法将 3rd 方模块源(例如 Tank Auth)与我自己的代码分开,我需要设置一个文件树,如下所示:

  • /project_root/
    • /system (框架系统 - 完成)
    • /3rd_party/
      • /dists/
      • /application/ (已安装 3d 方库/模块 -问题主题
    • /application/ (我的申请 - 完成)
    • /site/ (站点根目录,工作树 - 完成)

/system/application /site使用index.phpapplication/config/config.php设置完成。

是否有任何正确的方法可以使用配置设置来实现上述树?我是 Codeigniter 的新手,不知道这是否可能。

4

3 回答 3

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/',
);
  • /project_root/
    • /系统
    • /3rd_party/
      • /dists/
      • /应用/
        • tank_auth
        • 我的模块
        • some_other_third_party_code
    • /应用/
    • /地点/

“相对路径”相对于应用程序根目录中的任何子目录,例如models, controllers,helpers等。例如,在 CI 中,如果您使用以下命令,您可以从“视图”目录加载“模型”:

$this->load->model('../views/some_model');

...这不是你通常会做的事情——但这就是 HMVC 加载程序的工作方式。HVMC 可用于加载 CI 通常可以加载的任何内容,但可以从“模块”目录加载。您可以拥有任意数量的不同模块或模块路径。

模块可以(但不是必须)加载控制器并像它们自己的迷你应用程序一样工作。您还可以跨模块或从默认应用程序根加载依赖项。您仍然可以在模块旁边使用默认应用程序目录。要指定要从模块路径加载特定资产,只需在路径中包含模块名称:

// 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您将使用 URL http://example.com/tank_auth/login。您还可以使用该modules::run()方法在另一个控制器中运行控制器,这可以让您在自己的逻辑中“包装”模块的控制器方法,而无需触及它们:

class my_login extends MX_Controller {
    function index() {
        modules::run('tank_auth/login');
    }
}

它有很好的记录,并且已经存在多年。我几乎在我做过的每个 Codeigniter 项目中都使用了 HMVC,我强烈推荐它。

于 2012-12-19T18:16:27.930 回答
0

你不需要担心 HMVC(虽然它很棒),你也不需要MY_Loader

我会通读http://ellislab.com/codeigniter/user-guide/libraries/loader.html - 即关于应用程序“包”的部分

在这里,您将看到一个名为

$this->load->add_package_path()

您可以在其中为加载程序指定其他路径以查找您的库。

于 2012-12-17T15:17:37.637 回答
0

问题是加载库的加载器类$this->load->library("path/to/module")使用硬编码的“库”作为文件夹名称(检查 Loader.php 的源代码)。因此,换句话说,您所有的模块和库都必须驻留在库文件夹中

  • /project_root/

    • /system(框架系统 - 完成)
    • /图书馆/
      • /3rd_party/
        • /应用/

然后用$this->load->library('3rd_party/application/tankh_auth.php)`加载它们

解决这个问题的唯一方法(而不是使用库文件夹)是通过编写自己的. 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
}



}
于 2012-12-16T23:24:55.320 回答