YII解析:Module模块使用

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2 请确保在。 阅读详情

模块结构

在YII中,程序入口是一个继承CApplication的CWebApplication的应用程序,在一个web请求的整个过程中,控制器,模型和视图都是由Application进行创建和控制。首先我们来看一下CWebApplication的类的继承结构:

从上面我们可以看到CWebApplication本身也是一个CModue。在YII中,模块之间是一个树形结构。即每一个模块都可以包含多个子模块,每一个子模块可以继续包含子模块.其中APP为树的头节点,如图:


对于一个具体请求,假设route=A/B/C/D,下面我们讲述一下,APP怎么选择相应的模块和模块中的控制器Controller和动作Action。具体的流程图如下:

整个过程包括两个部分:选择模块和选择模块中的控制器。整个过程如下:
  1. 初始化情况下:module为YII::APP,route=a/b/c/d,id=null。
  2. 在module=YII::APP情况下,此时id=a,route=b/c/d。
    1. 如果id=a为当前module下控制器,此时,module,controller,action和$_GET都确定。
    2. 如果id=a确定不是当前module下的控制器,
      1. 在当前module下面找到了id=a的子模块,此时就更新模块为module=YII::APP/a,并且循环上面过程。
      2. 在当期module下面没有找到id=a的子模块,此时module不改变,并且在后面的过程中,模块也不会再改变。此时id=a指的当前模块下的目标控制器Controller的命名空间,即controller Namespace=a。
  3. 后面过程主要是更新当前模块下的目标控制器Controller的命名空间。

描述的不是很清楚,但是上面流程图还是很清晰的吧。

对于读过YII源码都直到,任何一个web请求都是通过CApplication::Run()函数开始,进入到CWebApplication::processRequest()。源码分别如下:

//CApplication

public function run()
{
	if($this->hasEventHandler('onBeginRequest'))
		$this->onBeginRequest(new CEvent($this));
	$this->processRequest();//===========
	if($this->hasEventHandler('onEndRequest'))
	$this->onEndRequest(new CEvent($this));
}
//CWebApplication

public function processRequest()
{
	if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))
	{
		$route=$this->catchAllRequest[0];
		foreach(array_splice($this->catchAllRequest,1) as $name=>$value)
			$_GET[$name]=$value;
	}
	else
		$route=$this->getUrlManager()->parseUrl($this->getRequest());
	$this->runController($route);//+++++++++++++++++++++
}
程序真正的进行到相应模块,控制器,动作是在函数processRequest的$this->runController($route);中,该函数传入的参数为$route。何为 $route。其实$route是一个类似A/B/C/D格式的字符串,该字符串中可能包含了模块,控制器,动作和$_GET相关参数。该函数是也是定义在CWebApplication中。代码如下:

//CWebApplication
public function runController($route)
{
	if(($ca=$this->createController($route))!==null)
	{
		list($controller,$actionID)=$ca;
		$oldController=$this->_controller;
		$this->_controller=$controller;
		$controller->init();
		$controller->run($actionID);
		$this->_controller=$oldController;
	}
	else
		throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
			array('{route}'=>$route===''?$this->defaultController:$route)));
}
通过该函数的名称字面意思为"运行控制器"。因此首先第一步就是要创建一个控制器,即函数createController($route)。我们知道控制器的是包含在模块中,因此也在该函数中,通过分析$route可以得到相应的模块,以及模块中的控制器和相应的动作,即list($controller,$actionID)=$ca;上面的流程图即为该函数createController($route)的函数流程图。

现在应该清楚了一个模块是怎么被web用户所调用了吧。下面我们说一下程序怎么在应用程序中添加模块,当然可能是通过配置文件。。。废话。


添加模块

上面我们知道模块之间是呈现树形结构,在每一个模块的basePath里面默认有一个modules目录来存放该模块的子模块,每一个子模块为一个子目录,一直这样的递归下去。对于web应用程序来说,把模块的程序文件分到相应的目录下面,不代表就就可以被用户所调用,需要通过配置文件进行配置,从而可以通过分析URL得到。在官方的文档也讲的怎么配置一个子模块。下面我们用例子来讲解怎么配置模块。

1.假设当前Web中只有一个YII::APP应用程序,当然它也是一个模块,访问的方式为http://localhost/index.php,此时在配置文件main.php中配置的modules如下:

'modules'=>array(),
2.假设YII::APP模块有两个子模块gii和test,此时我们就可以通过http://localhost/index.php/gii和http://localhost/index.php/test分别进行访问,此时配置文件为:

'modules'=>array(
	'gii'=>array(
			'class'=>'system.gii.GiiModule',
			'password'=>'chenze',					
	 ),
	'test',
),
3.此时我们假设gii模块下面还有一个子模块giiTest,此时我们就可以通过http://localhost/index.php/gii/giiTest进行访问,此时配置为:

'modules'=>array(
	'gii'=>array(
		'class'=>'system.gii.GiiModule',
		'password'=>'chenze',		
		'modules'=>array(
			'giiTest'
			),			
	 ),
	'test',
),
就这样递归下去咯


模块源码分析


CModule分析

1. 首先模块是一个CModule类型的组件(CComponent),即如下:

abstract class CModule extends CComponent
一个组件对象CComponent是一个可以用来挂载在组件上事件数组CComponet::$_event[]和行为数组CComponent::$_behavie[]的对象。因此也可以在CModule对象上挂载和模块相关的事件和行为信息。

2. 一个CModule对象包含了一些基本信息,如下:

  1. 一个模块拥有一个名称,即CModule::$_id属性。
  2. 一个模块有一个他所归属的父模块,即CModule::$_parentModule属性。
  3. 一个模块在物理上一个目录,拥有一个路径,可以通过该目录下面找到相应的控制器,模型和视图的程序文件。即CModule::$_basePath。这个值为模块程序文件(***Module.php)所在的目录。
  4. 一个模块下面可以包含多个子模块,子模块的程序文件放在当前模块目录下的"modules"里面,该目录由CModule::$_modulePath变量来标识,子模块通过子模块ID索引存储在CModule::$_modules[]和CModule::$_moduleConfig[]里面。
  5. 一个模块的正常运行需要其他组件CCOmponent的支持,比如db组件。通过CModule::$_components[]和CModule::$_componentConfig[]可以进行索引。对于一个模块,可以通过设置CModule::$preload[]数组来设置该模块需要预先加载的组件。
  6. 一个模块可以挂载一些与模块相关的行为CModule::$behaviors[]

3.一个CModule对象包含了一些基本操作,如下:

  1. 在当前模块下,创建和获得子模块:getModule($id)。
  2. 在当前模块下,加载和获得的模块中的组件对象:function getComponent($id,$createIfNull=true)。

4.在CModule对象的构造函数中定义了一个模块的初始化过程,因此一个继承的自定义模块的构造函数要调用父类的构造函数parent::__construct($id,$parent,$config=null)来初始化一个模块。

public function __construct($id,$parent,$config=null)//$id为模块ID,$parent为父模块ID
{
	$this->_id=$id;
	$this->_parentModule=$parent;
	// set basePath at early as possible to avoid trouble
	if(is_string($config))
		$config=require($config);
	if(isset($config['basePath']))
	{
		$this->setBasePath($config['basePath']);//设置模块路径
		unset($config['basePath']);
	}
	Yii::setPathOfAlias($id,$this->getBasePath());//把该模块的路径添加到Alias中,方便访问
	//下面几个函数就是模块的初始化需要做的几件事情,可以通过重写preinit()和init()来自定义模块可以通过自定义相应的函数来定制和初始化模块的参数
        $this->preinit();//预初始化,一般用来设置模块相关的行为对象$behaviors[],预加载对象$preload[],和其他配置。
	$this->configure($config);//加载配置
	$this->attachBehaviors($this->behaviors);//挂载行为对象
	$this->preloadComponents();//加载CModule::$preload[]中的预加载组件
	$this->init();//模块真正初始化,一般情况下,重写该函数完整模块初始化
}


CWebModule分析

YII有cli和web两种运行模式,所有CApplication,CModule都有相应在web环境的下的实现类。对于模块,即CWebModule类,该类是平时自定义模块时候的直接父类。该类主要定义了一些和一个web模块相关的参数,比如该模块的默认控制器和动作,页面布局对象等,下面我们具体来分析一下:

1. CWebModule中定义了上述和web相关的变量,即

  1. 一个模块包含了多个控制器,控制器通过名称进行索引,这些控制器一旦创建,可以通过数组CWebModule::$controllerMap[]进行索引,对于一个未提供控制器的请求,模块使用CWebModule::$defaultController='default'作为默认的控制器,相当于模块首页,所以在该模块下面的Controllers目录下,一般都一个DefaultController.php模块首页程序文件。这个和CWebApplication是不同的,CWebApplication::$defaultController="site"。
  2. 模块的控制器还有一个命名空间的概念,即CWebModule::$controllerNamespace。
  3. 一个模块有三个主要的路径:控制器文件,布局文件,视图文件分别由CWebModule::$_controllerPath,CWebMouble::$_layoutPath,CWebModule::$_viewPath指定,如果没有通过相应的set函数进行手动设定,默认值为分别为:$_controllerPath=$this->getBasePath().'/controllers';$_layoutPath=$_viewPath."/layouts" ; $_viewPath =$this->getBasePath()."/views";
  4. 一般情况下,需要手动指定一个模块的布局文件,通过设置CWebModule::$layout。如果没有指定,那么该模块将会使用父模块的布局或者YII::APP中定义的布局文件,即CWebApplication::$layout="main"。

2.CWebModule中定义的操作不多,对于一个自定义的模块一般只需要重写CModule中的函数就可以定制。CWebModule只有两个函数可以进行覆盖,即如下:

public function beforeControllerAction($controller,$action)
{
	if(($parent=$this->getParentModule())===null)
		$parent=Yii::app();
	return $parent->beforeControllerAction($controller,$action);
}

public function afterControllerAction($controller,$action)
{
	if(($parent=$this->getParentModule())===null)
		$parent=Yii::app();
	$parent->afterControllerAction($controller,$action);
}

可以通过此两个函数对该模块中的每一个请求进行一些改写,控制以及收尾的相关工作。在自定义的模块中,两个函数的覆盖的模版如下:

public function beforeControllerAction($controller, $action)
{
	if(parent::beforeControllerAction($controller, $action))
	{
		// this method is called before any module controller action is performed
		// you may place customized code here
		return true;
	}
	else
		return false;
}


ENVI_基于无人机数据的果树提取与相对健康监测 一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me... 阅读详情

相关推荐

告别Arduino IDE!用VSCode搭建Arduino UNO R3开发环境(含代码补全配置)

本文详细指导如何用VSCode替代Arduino IDE搭建Arduino UNO R3开发环境,包含代码补全配置和高效开发技巧。通过安装必要插件、配置项目结构和优化工作流,可显著提升开发效率,特别适合复杂项目开发。文章还提供了常见问题解决方案和高级功能调优方法。

weixin_30698297的博客 477

Yii modules模块配置

在开发过程中,一个项目中,项目的功能可能会分为多个模块,例如,如果我们的项目为电商的管理控制系统的话,这时候我们的项目可能就会分为销售模块,采购模块,财务模块等等,这时候我们如果可以将项目按照一个个模块区分开来,在一个目录下专门写指定模块的代码,这样的话,我们的项目结构是不是就什么的清楚明了呢?在Yii中,我们可以使用modules来实现代码模块话 一:modules配置 在配置文件中main...

huaweichenai的博客 865

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 559

Yii1 跨模块调用模型

Yii1跨模块调用模型

龙少技术博客 2805

PCB数据集

整理了一部分PCB数据集

m0_57996537的博客 3867

【rPPG】基于多光谱摄像头的非接触式睡眠血氧监测系统(传统建模方法解析)

本文深入解析了基于多光谱摄像头的非接触式睡眠血氧监测系统,重点探讨了rPPG技术的原理、硬件设计及传统建模方法。通过多光谱摄像头捕捉皮肤微弱光学变化,实现医疗级精度的心率和血氧监测,特别适合长期睡眠监测场景。文章详细介绍了摄像头选型、照明系统设计以及PBV模型等核心技术,并对比了与传统传感器的性能差异。

weixin_30300225的博客 562

yii 模块.php文件,yii框架的模块(module)配置

yii中的模块看起来更像一个应用。主要区别是模块不能单独部署,必须存在于一个应用中。用户可以像访问普通应用控制器那样,访问模块中的控制器。模块在一些大型应用中,非常有用,可以将应用划分为几个模块,每个模块可以单独维护。紧接上篇文章《yii框架之hello world》,在modules文件夹下,建立hello文件夹。即在“模块(modules)”目录下,建立hello模块。如图示:在hello模块...

weixin_42345731的博客 272

DCM、PLL以及DLL等概念及详情

介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。

CLL_caicai的博客 8337

Yii2 中关于模块(Modules)的使用及配置

什么是模块 (如果你的需求是对模块或子模块进行独立配置,请查看文末!) 在Yii2.x框架中,引入了模块(Modules)这个概念,那么什么是模块呢? 模块是独立的软件单元,由模型,视图, 控制器和其他支持组件组成, 终端用户可以访问在应用主体中已安装的模块的控制器, 模块被当成小应用主体来看待, 和应用主体不同的是, 模块不能单独部署,必须属于某个应用主体。 上面的描述是简单理解就是你在现有...

谷子的博客 8124

Windows远程桌面开发之九-虚拟显示器(Windows 10 Indirect Display 虚拟显示器驱动开发)

by fanxiushu 2019-06-24 转载或引用请注明原始作者。 这里与远程桌面关系不是太大,但这个部分是xdisp_virt远程控制程序的实现多显示器桌面扩展的子功能,因此也归为远程桌面开发一类。 这篇文章与之前发布的...

fanxiushu的专栏 2万+

【科研绘图系列】R语言绘制代谢物与临床表型相关性的森林图

本研究通过森林图展示了特定代谢物与三种临床比较之间的相关性分析结果。这种方法不仅直观地展示了每个代谢物的效应大小和不确定性,还允许我们比较不同代谢物在不同临床比较中的影响。森林图的结果表明,某些代谢物在特定临床比较中显示出显著的相关性,这可能为理解疾病的代谢机制提供了重要线索。

专注生信领域 565

YII框架分析笔记11:模块module

module是对相同业务逻辑的app中的内容模块化,比如博客前台系统可以模块化成blog,博客后台系统可以模块化成admin,模块化便于对应用的管理扩展。 加载module的配置 //加载框架中自带gii模块和一个自定义admin模块 'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>

wzllai的专栏 5624

在 SAP GUI 里开发与调用 Adobe PDF 表单:SFP 建模 + Driver Program 调用的全流程实战

本文介绍了在SAP系统中使用Adobe PDF表单的完整流程。重点阐述了SAP Interactive Forms相比传统表单工具的优势,特别是在处理复杂排版、条码和交互式字段时的适用性。文章详细说明了开发流程:从安装设计工具Adobe LiveCycle Designer开始,到在SFP事务码中创建Interface和Form的数据模型,再到编写驱动程序的ABAP代码实现PDF输出。特别强调了Interface作为数据契约的重要性,以及如何通过分层设计实现前后端分离开发。最后提供了标准调用链的示例代码,展

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 275

Yii2 模块(Module)开发实战:从目录结构、路由解析到嵌套模块的完整指南

模块是 Yii2 中组织大型应用功能的核心单元,它把模型、视图、控制器及辅助组件打包成一个可独立开发、独立维护的"迷你应用"。本文以仓库中 [docs/guide-es/structure-modules.md](https://link.gitcode.com/i/8d3492c6fba8dc4dea5f19132f9b74f9) 为主线,结合 [framework/base/Module.ph

gitblog_00899的博客 192

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Yii2 模块(Module)完全指南:创建、路由、嵌套与组件隔离的实战解析

模块(Module)是 Yii2 中由模型、视图、控制器及其他支撑组件构成的自包含软件单元,常被视为"迷你应用"。本文以官方指南《structure-modules》(日文版位于 [docs/guide-ja/structure-modules.md](https://link.gitcode.com/i/89dd74fc00262ffa8ef99972b1c3a822),英文版位于 [docs/

gitblog_00974的博客 292

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

yii2笔记: 模块(module)

官方文档 http://www.yiiframework.com/doc-2.0/guide-structure-modules.html 自己的一些理解: application和console本质上也都是module 我们建立的module实质上都是application的子模块 module里加载特定配置 Module.php <?php names...

weixin_30662539的博客 124

[yii2]Module的Namespace和控制器位置

namespace和目录对应,否则无法找到控制器类,module文件在根路径 使用gii生成Module为\app\admin,那么 namespace app; class admin extends \yii\base\Module { public $controllerNamespace = 'app\controllers\admin'; ...

a5213573的博客 395

yii2源码学习笔记(十四)

Module类是模块和应用类的基类。  yiisoft\yii2\base\Module.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http:/...

diaopeng8543的博客 204

yii2框架随笔31

今天来看vendor/yiisoft/yii2/base/Module. php <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ ...

weixin_30699831的博客 148

Yii 2.0 在控制器里面的init方法里面重定向报错

在module里面 实例化controller[createController] 之后, 才将controller绑定到Yii::app而绑定action到当前controller的节点则在controllerrunAction之后因此,你在module没有执行runAction之前,Yii::app 而绑定action到当前controller的节点 则在 controller runActi...

这不是我的博客 932

php yii2的控制器,PHP_Yii2创建控制器(createController)方法详解,本文实例讲述了Yii2创建控制器 - phpStudy...

Yii2创建控制器(createController)方法详解本文实例讲述了Yii2创建控制器(createController)方法。分享给大家供大家参考,具体如下:yii中创建控制器的是在application中的request通过UrlManager解析得出路由信息的,然后再由yii\base\Module中的public function runAction($route, $params...

weixin_32334209的博客 435

php怎么创建控制器,Yii2创建控制器(createController)方法详解

本文实例讲述了Yii2创建控制器(createController)方法。分享给大家供大家参考,具体如下:yii中创建控制器的是在application中的request通过UrlManager解析得出路由信息的,然后再由yii\base\Module中的public function runAction($route, $params = [])方法来创建控制器,最后由控制器再执行相应的动作。首...

weixin_36078604的博客 740

yii2 layout main.php,Yii2里面布局Layout的缺省设置

yii2里面渲染视图时,需要先查找layout,这个逻辑是在yii2/base/Controller/renderContent里面实现的:publicfunctionrenderContent($content){$layoutFile=$this->findLayoutFile($this->getView());if($layoutFile!==false){re...

weixin_28956461的博客 370

学习yii2.0框架阅读代码(十一)

vendor/yiisoft/yii2/base/Module. php(续) /** * 该方法解析指定的路线和创建相应的子模块(s),控制器和行动 * This method parses the specified route and creates the corresponding child module(s), controller a...

weixin_30268071的博客 107

Yii 2 核心术语完全指南:从 alias 到 vendor 的架构概念解析(基于官方术语表)

> 本文以 Yii 2 框架官方术语表([docs/guide-ru/glossary.md](https://link.gitcode.com/i/7a60ba0b45510d7ebd3fdd3a86703124))为骨架,逐条解析 alias、application、assets、attribute、bundle、configuration、extension、installation、mod

gitblog_01032的博客 258

学习yii2.0框架阅读代码(二十一)

vendor/yiisoft/yii2/base/Module.php(完) /** * 创建一个控制器基于给定控制器ID. * * The controller ID is relative to this module. The controller class * should be namespaced under [[...

weixin_30641999的博客 106

Yii 2 应用结构详解:从 MVC 架构到六大核心组成实体

Yii 2 框架将整个应用按照经典的 model-view-controller(MVC)架构模式组织,并在此基础上抽象出入口脚本、应用、应用组件、模块、过滤器与 Widget 六大实体,共同支撑一次完整请求的处理闭环。本文以 [docs/guide-pt-BR/structure-overview.md](https://link.gitcode.com/i/24349ac8f8553f382d

gitblog_01022的博客 1032
上一篇: linux基础编程:多线程基础总结:线程创建 终止 线程同步/互斥量/条件变量/信号灯
下一篇: [RabbitMQ+Python入门经典] 兔子和兔子窝
ColZer
博客等级 码龄14年 42粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值