nguyenanhung/codeigniter-hmvc

v1.2 2018-10-27 03:42 UTC

This package is auto-updated.

Last update: 2024-08-27 16:45:31 UTC


README

支持模块扩展的发展 - HMVC 到 WireDesignz

Support development

模块扩展 - HMVC

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

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

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

设计者:wiredesignz,非常感谢!

特性

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

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

在application/config.php文件中可以设置Modules::$locations数组。例如:

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

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

可以使用以下方式将控制器加载为其他控制器的类变量:

$this->load->module('module/controller');

或者简单地

$this->load->module('module');

如果控制器名称与模块名称匹配。

任何加载的模块控制器都可以像库一样使用,例如:

 $this->controller->method();

,但它可以独立于调用者访问其自己的模型和库。

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

如何使用

我是自定义库,现在配置相同的规则以下

使用composer安装

composer require nguyenanhung/codeigniter-hmvc

并创建文件application/core/MY_Loader.php,内容如下

<?php
include 'vendor/autoload.php';
use nguyenanhung\CodeIgniter\HMVC\BaseLoader;

class MY_Loader extends BaseLoader
{
}

并创建文件application/core/MY_Router.php,内容如下

<?php
include 'vendor/autoload.php';
use nguyenanhung\CodeIgniter\HMVC\BaseRouter;

class MY_Router extends BaseRouter
{
}

注意

要使用HMVC功能,如

Modules::run();

,控制器必须扩展MX_Controller类。

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

您必须在控制器中使用PHP5样式构造函数。例如:

<?php
class Xyz extends MX_Controller 
{
    function __construct()
    {
        parent::__construct();
    }
}

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

所有MY_扩展库都应该包含(要求)其等效MX库文件并扩展其等效MX_类

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

<?php
$route['module_name'] = 'controller_name';

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

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

资源可以在模块之间跨加载。例如:

$this->load->model('module/model');

Modules::run()旨在返回视图部分,并且它将从控制器返回缓冲输出(视图)。使用modules::run的语法是URI样式分段字符串和无限变量。

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

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

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

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

要从控制器中调用模块控制器,可以使用

$this->load->module();

或者

Modules::load();

PHP5方法链对MX加载的任何对象都可用。

$this->load->library(‘validation’)->run();

要为模块加载语言,建议使用Loader方法,该方法将活动模块名称传递给Lang实例;例如:

$this->load->language('language_file');

PHP5的spl_autoload功能允许您无需特别包含或require,即可从application/core或application/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变量分配给表单验证库之前。这将允许您的回调方法正常工作。(这在CI论坛上也有讨论)。

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

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

视图部分

在视图中使用模块作为视图部分与编写一样简单

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

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

模块扩展安装

  1. 从干净的CI安装开始
  2. 正确设置$config['base_url']以适应您的安装
  3. 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
  4. 将模块扩展的third_party文件放入application/third_party目录
  5. 将模块扩展的核心文件放入application/core,除非您想创建自己的控制器扩展,否则不需要MY_Controller.php文件
  6. 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
  7. 创建模块目录结构application/modules/welcome/controllers
  8. 将控制器application/controllers/welcome.php移动到application/modules/welcome/controllers/welcome.php
  9. 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
  10. 创建目录application/modules/welcome/views
  11. 将视图application/views/welcome_message.php移动到application/modules/welcome/views/welcome_message.php
  12. 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter

现在您应该有一个正在运行的模块扩展安装。

安装指南提示

-步骤1-3告诉您如何使标准CI安装正常工作 - 如果您有一个干净/测试过的CI安装,请跳到步骤4。

-步骤4-5显示安装MX后正常CI仍然可以工作 - 它不应该干扰正常的CI设置。

-步骤6-8显示MX与CI一起工作 - 控制器已移动到“welcome”模块,视图文件仍然位于CI的应用程序/views目录中 - MX可以在多个位置找到模块资源,包括应用程序目录。

-步骤9-11显示MX在“welcome”模块中与控制器和视图一起工作 - 应用程序/controllers或application/views目录中不应有任何文件。

常见问题解答

Q. 什么是模块,为什么我应该使用它们?

A. (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)

Q. 什么是模块化HMVC,为什么我应该使用它?

A. 模块化HMVC = 多个MVC三元组的层次结构

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

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

使用库和“模块化HMVC”HMVC类的区别是:1. 在HMVC类中不需要获取并使用CI实例 2. HMVC类存储在模块目录中,而不是库目录。

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

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

模块化HMVC意味着模块化MVC三元组。模块化分离和模块化扩展允许将相关的控制器、模型、库、视图等分组在模块目录中,并像迷你应用程序一样使用。但是,模块化扩展更进一步,允许这些模块“相互通信”。你可以获取控制器输出,而无需再次通过HTTP接口输出。