bitmannl / codeigniter-modular-extensions
使用 Composer 安装 CodeIgniter Modular Extensions HMVC(WireDesignz)
This package is not auto-updated.
Last update: 2024-09-17 23:40:27 UTC
README
支持 Modular Extensions - HMVC 的发展
Modular Extensions - HMVC
Modular Extensions 使 CodeIgniter PHP 框架模块化。模块是一组独立的组件,通常是模型、控制器和视图,它们被安排在应用程序的模块子目录中,可以插入到其他 CodeIgniter 应用程序中。
HMVC 代表分层模型视图控制器。
模块控制器可以用作普通控制器或 HMVC 控制器,并可作为小部件使用,帮助您构建视图部分。
功能
所有控制器都可以包含一个 $autoload 类变量,该变量包含在运行构造函数之前要加载的项目数组。这可以与模块/config/autoload.php 一起使用,但仅当使用 $autoload 变量时才对特定控制器有效。
:::php
<?php
class Xyz extends MX_Controller
{
$autoload = array(
'helper' => array('url', 'form'),
'libraries' => array('email'),
);
}
可以在应用程序/config.php 文件中设置 Modules::$locations 数组。例如
:::php
<?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 通过 module/controller/method 或简单地 module/method 访问(如果模块和控制器名称匹配)。如果您在控制器中添加了 _remap() 方法,您可以防止从 URL 不必要地访问它们,并按您喜欢的方式进行重定向或标记错误。
注意
要使用 HMVC 功能,如 Modules::run(),控制器必须扩展 MX_Controller 类。
要仅使用模块化分离,而不使用 HMVC,控制器将扩展 CodeIgniter Controller 类。
您必须在控制器中使用 PHP5 风格的构造函数。例如
:::php
<?php
class Xyz extends MX_Controller
{
function __construct()
{
parent::__construct();
}
}
除非您需要加载或处理在控制器首次创建时需要的东西,否则不需要构造函数。
所有 MY_ 扩展库都应该包含(要求)其等效的 MX 库文件,并扩展其等效的 MX_ 类
每个模块可能包含一个 config/routes.php 文件,其中可以使用以下内容定义该模块的路由和默认控制器
:::php
<?php
$route['module_name'] = 'controller_name';
可以从应用程序/controllers 子目录中加载控制器。
也可以从模块/controllers 子目录中加载控制器。
可以在模块之间交叉加载资源。例如:$this->load->model('module/model');
Modules::run() 是为返回视图部分而设计的,它将从控制器返回缓冲输出(视图)。使用 modules::run 的语法是 URI 风格的分割字符串和无限制的变量。
:::php
<?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(),MX 提供的对象可以使用 PHP5 方法链。
为了加载模块的语言,建议使用Loader方法,该方法会将活动模块名称传递给Lang实例;例如:$this->load->language('language_file');
PHP5的spl_autoload功能允许您自由扩展控制器、模型和库,而无需专门包含或要求它们,从application/core或application/libraries的基类。
库加载器也已更新,以适应一些CI 1.7功能:例如,库别名以与模型别名相同的方式接受,并添加了从模块配置目录加载配置文件作为库参数(例如form_validation.php)。
$config = $this->load->config(‘config_file’), 将加载的配置数组返回到您的变量。
模型和库也可以从各自的application目录的子目录中加载。
当使用MX进行表单验证时,您需要像下面这样扩展CI_Form_validation类,
:::php
<?php
/** application/libraries/MY_Form_validation **/
class MY_Form_validation extends CI_Form_validation
{
public $CI;
}
在将当前控制器作为$CI变量分配给表单验证库之前。这将使您的回调方法正常工作。(这已在CI论坛上讨论过)。
:::php
<?php
class Xyz extends MX_Controller
{
function __construct()
{
parent::__construct();
$this->load->library('form_validation');
$this->form_validation->CI =& $this;
}
}
视图部分
在视图中使用模块作为视图部分,就像编写
:::php
<?php echo Modules::run('module/controller/method', $param, $...); ?>
参数是可选的,您可以传递任意数量的参数。
模块扩展安装
- 从干净的CI安装开始
- 正确设置$config[‘base_url’]以匹配您的安装
- 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
- 将模块扩展的third_party文件放入application/third_party目录
- 将模块扩展的核心文件放入application/core,MY_Controller.php文件不是必需的,除非您希望创建自己的控制器扩展
- 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
- 创建模块目录结构application/modules/welcome/controllers
- 将控制器application/controllers/welcome.php移动到application/modules/welcome/controllers/welcome.php
- 访问URL /index.php/welcome => 显示欢迎使用CodeIgniter
- 创建目录application/modules/welcome/views
- 将视图application/views/welcome_message.php移动到application/modules/welcome/views/welcome_message.php
- 访问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”模块的控制器和视图一起工作 - 应用程序控制器或views目录中不应有任何文件。
常见问题解答
问题:什么是模块?为什么我应该使用它们?
答案:(http://zh.wikipedia.org/wiki/%E6%A8%A1%E5%9D%97)
(http://zh.wikipedia.org/wiki/%E6%A8%A1%E5%9D%97%E7%BC%96%E7%A8%8B)
(http://blog.fedecarg.com/2008/06/28/a-modular-approach-to-web-development)
问题:什么是模块化的HMVC,为什么我应该使用它?
答案:模块化HMVC = 多个MVC三元组的层次结构
当您需要在视图中加载视图及其数据时,这非常有用。考虑向页面添加购物车。购物车需要自己的控制器,该控制器可能需要调用模型来获取购物车数据。然后控制器需要将数据加载到视图中。因此,而不是主控制器处理页面和购物车,购物车MVC可以直接在页面中加载。主控制器不需要知道它,并且与之完全隔离。
在CI中,我们无法在每个请求中调用多个控制器。因此,为了实现HMVC,我们必须模拟控制器。这可以通过库或使用此“模块扩展HMVC”贡献来完成。
使用库和使用“模块化HMVC”HMVC类的区别是
- 在HMVC类中无需获取和使用CI实例
- HMVC类存储在模块目录中,而不是库目录。
问:模块扩展HMVC与模块分离是否相同?
答:是,也不是。和模块分离一样,模块扩展使得模块可以“便携”到其他安装中。例如,如果你创建了一个完美的自包含的模型-控制器-视图文件集,你可以通过复制一个文件夹将那个MVC引入另一个项目——所有内容都集中在一个地方,而不是分散在模型、视图和控制器的文件夹中。
模块化HMVC意味着模块化的MVC三元组。模块分离和模块扩展允许将相关的控制器、模型、库、视图等分组在模块目录中,并像迷你应用程序一样使用。但是,模块扩展更进一步,允许这些模块“对话”。你可以获取控制器输出,而无需再次通过HTTP接口。