单独的第三方模块

时间:2012-12-14 21:15:29

标签: codeigniter

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

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

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

使用配置设置有没有正确的方法来实现上面的树?我是Codeigniter的新手,并且不知道这是否可能。

3 个答案:

答案 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/',
);
  • / project_root /
    • /系统
    • / 3rd_party中/
      • / dists中/
      • /应用/
        • tank_auth
        • my_module
        • some_other_third_party_code
    • /应用/
    • /站点/

"相对路径"相对于应用程序根目录中的任何子目录,例如modelscontrollershelpers等。例如,在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()

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