codinghamster/codeigniter-modular-extensions-hmvc

CodeIgniter框架模块扩展 - HMVC

1.1.0 2018-07-18 07:02 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:21:12 UTC


README

这是https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc项目的分支。

模块扩展使CodeIgniter PHP框架模块化。模块是一组独立的组件,通常包括模型、控制器和视图,它们被组织在应用程序的模块子目录中,可以将其放入其他CodeIgniter应用程序中。

HMVC代表层次化模型视图控制器。

模块控制器可以用作普通控制器或HMVC控制器,并且可以用作小部件来帮助您构建视图部分。

安装

步骤1. 使用composer安装包

composer require codinghamster/codeigniter-modular-extensions-hmvc

步骤2. 在您的application/core目录中创建两个文件

MY_Loader.php

<?php

class MY_Loader extends MX_Loader {}

MY_Router.php

<?php

class MY_Router extends MX_Router {}

替代安装

如果您不使用composer,只需下载仓库并将它的corethird_party目录复制到您的application目录中。

配置

您可能希望配置模块的加载位置。

只需在您的application/config/config.php中设置$config['modules_locations']

$config['modules_locations'] = array(
    APPPATH.'modules/' => '../modules/',
);

功能

所有控制器都可以包含一个$autoload属性,该属性包含在运行构造函数之前要加载的项的数组。这可以与module/config/autoload.php一起使用,但是仅对特定控制器使用$autoload变量。

class Xyz extends MX_Controller
{
    public $autoload = array(
        'helper'    => array('url', 'form'),
        'libraries' => array('email'),
    );
}

Modules::run()的输出被缓冲,因此从控制器返回或直接输出的任何数据都会被捕获并返回给调用者。特别是,可以使用$this->load->view()作为在普通控制器中一样,无需返回。

可以使用$this->load->module('module/controller')将控制器加载为其他控制器的类变量;或者如果控制器名称与模块名称匹配,则简单地使用$this->load->module('module');

任何加载的模块控制器都可以像库一样使用,例如:$this->controller->method(),但它可以独立于调用者访问自己的模型和库。

所有模块控制器都可以通过URL访问,通过模块/控制器/方法或简单地模块/方法,如果模块和控制器名称匹配。如果您在控制器中添加了_remap()方法,则可以防止从URL访问它们,并按您喜欢的方式重定向或标记错误。

注意

要使用HMVC功能,如Modules::run(),控制器必须扩展MX_Controller类。

要仅使用模块分离,而不使用HMVC,控制器将扩展CodeIgniter Controller类。

您必须在控制器中使用PHP5风格的构造函数。例如

class Xyz extends MX_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}

除非您需要在控制器首次创建时加载或处理某些内容,否则不需要构造函数。

所有MY_扩展库应包括(要求)它们等效的MX库文件并扩展它们等效的MX_类。

每个模块可能包含一个config/routes.php文件,其中可以定义该模块的路由和默认控制器

$route['module_name'] = 'controller_name';

控制器可以从application/controllers子目录中加载。

控制器也可以从module/controllers子目录中加载。

资源可以在模块间交叉加载。例如:$this->load->model('module/model');

Modules::run()是为了返回视图部分而设计的,它将从控制器返回缓冲输出(视图)。使用modules::run的语法是URI风格分段字符串和无限制的变量。

/** module and controller names are different, you must include the method name also, including 'index' **/
Modules::run('module/controller/method', $params, ...$more);

/** module and controller names are the same but the method is not 'index' **/
Modules::run('module/method', $params, ...$more);

/** module and controller names are the same and the method is 'index' **/
Modules::run('module', $params, ...$more);

/** Parameters are optional, You may pass any number of parameters. **/

要从控制器内部调用模块控制器,可以使用$this->load->module()Modules::load(),MX支持任何由MX加载的对象的PHP5方法链,例如:$this->load->library('validation')->run()

为了加载模块的语言,建议使用Loader方法,该方法将活动模块名称传递给Lang实例;例如:$this->load->language('language_file');

PHP5的spl_autoload功能允许您从application/coreapplication/libraries的基本类中自由扩展您的控制器、模型和库,而无需明确包含或要求它们。

库加载器也已更新,以适应一些CI 1.7功能:例如,库别名以与模型别名相同的方式接受,并添加了从模块配置目录加载配置文件作为库参数(例如:form_validation.php)。

$config = $this->load->config('config_file')将加载的配置数组返回到您的变量。

模型和库也可以从各自的应用程序目录的子目录中加载。

当使用MX进行表单验证时,您需要扩展CI_Form_validation类,如下所示

<?php

/** application/libraries/MY_Form_validation **/
class MY_Form_validation extends CI_Form_validation
{
    public $CI;
}

在将当前控制器作为$CI变量分配给form_validation库之前。

这将允许您的回调方法正常工作。(这在CI论坛上也有讨论)。

<?php

class Xyz extends MX_Controller
{
    function __construct()
    {
        parent::__construct();

        $this->load->library('form_validation');
        $this->form_validation->CI =& $this;
    }
}

视图部分

在视图中使用模块作为视图部分就像编写以下内容一样简单

<?=Modules::run('module/controller/method', $param, ...$more);?>

参数是可选的,您可以传递任意数量的参数。

常见问题解答

问题:什么是模块,为什么我应该使用它们?

答案:[链接](http://en.wikipedia.org/wiki/Module)

http://en.wikipedia.org/wiki/Modular_programming

http://blog.fedecarg.com/2008/06/28/a-modular-approach-to-web-development

问题:什么是模块化HMVC,为什么我应该使用它?

答案:模块化HMVC = 多个MVC三联体的层次结构

这在需要在一个视图中加载视图及其数据时非常有用。考虑向页面添加购物车。购物车需要一个自己的控制器,该控制器可能调用模型来获取购物车数据。然后控制器需要将数据加载到视图中。因此,而不是由主控制器处理页面和购物车,购物车MVC可以直接加载到页面中。主控制器不需要了解它,并且与其完全隔离。

在CI中,我们无法在每个请求中调用多个控制器。因此,为了实现HMVC,我们必须模拟控制器。这可以通过库或通过这个“模块化扩展HMVC”贡献来实现。

使用库和使用“模块化HMVC”类的区别是

  1. 不需要在HMVC类中获取和使用CI实例。
  2. HMVC类存储在模块目录中,而不是库目录中。

问题:模块化扩展HMVC与模块化分离是否相同?

答案:是和否。像模块化分离一样,模块化扩展使模块“便携”到其他安装。例如,如果您制作了一个非常好的自包含的模型-控制器-视图文件集,您可以通过仅复制一个文件夹将那个MVC带入另一个项目——所有内容都在一个地方,而不是散布在模型、视图和控制文件夹中。

模块化HMVC意味着模块化MVC三联体。模块化分离和模块化扩展允许相关的控制器、模型、库、视图等在模块目录中分组并作为小程序使用。但是,模块化扩展更进一步,允许这些模块“交谈”。您可以在不通过http接口再次发出请求的情况下获取控制器输出。