HMVC
  1. HMVC简介

    HMVC(Hierarchical-Model-View-Controller),也可以叫做 Layered MVC。
    顾名思义,就是按等级划分的 MVC 模式,简单的解释就是把MVC又细分成了多个子 MVC,
    每个模块就分成一个 MVC。使用 HMVC 的好处就是可以降低各个功能模块之间的耦合性,
    提高代码复用性,使得每个功能都可以独立出来,每个模块都有自己的 MVC 结构。
  2. 注册HMVC模块

    如果我们要启用一个hmvc模块,我们需要在入口文件index.php里面修改下面的配置:
    						//注册hmvc模块,数组键是uri里面的hmvc模块名称,值是hmvc模块文件夹名称
    						->setHmvcModules(array(
    							// 'Demo' => 'demo'
    						))
    					
    可以看到数组里面是我们访问hmvc模块的时候URL里面的hmvc模块名称,
    是hmvc模块的文件夹名称
  3. HMVC结构

    Soter的hvmc子模块默认都在application/hmvc目录里面,一个模块一个目录。

    1.Soter的HMVC目录结构

    application
    	|- classes
    		|- Controller
    			|- controllers.php
    		|- Model
    			|- models.php
    		|- ...
    	|- views
    		|- index.php
    		|- footer.php
    		|- ...
    	|- hmvc
    		|- hmvc_module1
    			|- classes
    				|- Controller
    					|- controllers.php
    				|- Model
    					|- models.php
    				|- ...
    			|- views
    				|- index.php
    				|- footer.php
    				|- ...
    			|- ....
    		|- hmvc_module2
    			|- classes
    				|- Controller
    					|- controllers.php
    				|- Model
    					|- models.php
    				|- ...
    			|- views
    				|- index.php
    				|- footer.php
    				|- ...
    			|- ....
    		|- ....
    					
  4. 访问HMVC模块

    当我们在入口文件里面启用了一个hmvc模块之后,默认情况下我们可以通过pathinfo路由模式和get路由模式访问hmvc模块。
    假如我们在入口文件注册了Demo=>demo HMVC模块,url中对应模块名称是Demo。

    1.pathinfo模式

    比如:http://127.0.0.1/index.php/Demo/Welcome/index.do
    可以看到我们只需要在index.php/后面跟上hmvc模块配置的名称即可,这里是Demo,然后后面就是 控制器名称/方法名称.do
    上面的url访问的是demo hmvc模块的Welcome控制器的do_index方法。

    2.get模式

    get模式很简单,我们只需要通过m参数指定hmvc模块配置名称即可。
    比如:http://127.0.0.1/index.php?m=Demo&c=Welcome&a=index
    上面的url访问的是demo hmvc模块的Welcome控制器的do_index方法。
  5. HMVC模块绑定子域名

    在入口文件里面我们可以看到下面的配置:
    						/* hvmc模块域名绑定
    						 * 1.子域名绑定
    						 * domains的键是二级开始的域,不包含顶级域名.
    						 * 比如顶级域名是test.com,这里的domains的键是demo代表demo.test.com
    						 * 再比如domains的键是i.user代表i.user.test.com
    						 * isFullDomain这里设置为false.
    						 * 2.完整域名绑定
    						 * domains的键是完整的域名,比如demo.com,
    						 * isFullDomain这里设置为true.
    						 * 配置项介绍:
    						 *	0.最外层的enable是总开关.
    						 * 	1.hmvcModuleName是域名要绑定的hmvc模块名称,
    						 *	   也就是对应着上面的setHmvcModules()注册的关联数组中的"键"名称.
    						 * 	2.demo下面的enable是单个域名绑定是否启用.
    						 * 	3.domainOnly是否只能通过绑定的域名访问hvmc模块.
    						 * 	4.绑定完整的域名isFullDomain这里设置为true.
    						 *	   绑定子域名isFullDomain这里设置为false.
    						 */
    						->setHmvcDomains(array(
    						    'enable' => false, //总开关,是否启用
    						    'domains' => array(
    							'demo' => array(
    							    'hmvcModuleName' => 'Demo', //hvmc模块名称
    							    'enable' => false, //单个开关,是否启用
    							    'domainOnly' => true, //是否只能通过绑定的域名访问
    							    'isFullDomain' => false//绑定完整的域名设置为true;绑定子域名设置为false
    							)
    						    )
    						))
    					
    上面的配置就是定义子域名和hmvc模块的绑定关系,如果需要配置多个域名绑定,在domains下面增加多个配置数组即可.
    提示:
    假设当前访问的网站顶级域名是test.com。
    绑定设置如下:
    						->setHmvcDomains(array(
    						    'enable' => true,
    						    'domains' => array(
    								'demo' => array(
    										'hmvcModuleName' => 'Demo', 
    										'enable' => true, 
    										'domainOnly' => true,
    										'isFullDomain' => false
    								),
    								'i.u' => array(
    										'hmvcModuleName' => 'User', 
    										'enable' => true, 
    										'domainOnly' => true,
    										'isFullDomain' => false
    								),
    								'news.com' => array(
    										'hmvcModuleName' => 'News',
    										'enable' => true, 
    										'domainOnly' => true,
    										'isFullDomain' => true
    								),
    						    )
    						))
    					
    当我们的hvmc模块绑定了子域名之后,绑定前后的访问方式如下:
    1.访问 Demo hmvc模块的控制器Welcome的index方法
    绑定前:http://test.com/index.php/Demo/Welcome/index.do
    绑定后:http://demo.test.com/index.php/Welcome/index.do
    2.访问 User hmvc模块的控制器Welcome的index方法
    绑定前:http://test.com/index.php/User/Welcome/index.do
    绑定后:http://i.u.test.com/index.php/Welcome/index.do
    3.访问 News hmvc模块的控制器Welcome的index方法
    绑定前:http://test.com/index.php/News/Welcome/index.do
    绑定后:http://news.com/index.php/Welcome/index.do