- 1、定義了模塊(module)類的命名規範,如下:
- 1、把{模塊名}首字母轉換爲大寫
- 2、{類名}={模塊名}+Controller
- 3、{自定義類名}=Custom+{模塊名}+Controller
- 2、創建控制器實例的流程
- 1、如果存在'custom/modules/{模塊名}/controller.php'控制器則使用{自定義類名}創建一個控制器實例,否則使用{類名}創建一個控制器實例。否則執行下面的2條件:
- 2、如果存在'modules/{模塊名}/controller.php'控制器則使用{自定義類名}創建一個控制器實例,否則使用{類名}創建一個控制器實例。否則執行下面的3條件:
- 3、如果存在CustomSugarController類則創建CustomSugarController控制器。否則執行下面的4條件:
- 4、如果存在SugarController類則創建SugarController控制器
- 3、$controller->setup($module)設置控制器實例的屬性值以及action映射,這些屬性的值都是從請求URL得到,如下:
- 1、設置 module 屬性值
- 2、設置 action 屬性值
- 3、設置 record 屬性值
- 4、設置 view 屬性值
- 5、設置 return_module 屬性值
- 6、設置 return_action 屬性值
- 7、設置 return_id 屬性值
- 8、加載 action_view_map.php 文件,此值從以下目錄加載,越往下的目錄其優先級越高,即會覆蓋之前的 action_view_map 屬性值
- 1、include/MV/Controller/action_view_map.php
- 2、modules/{module}/action_view_map.php
- 3、custom/modules/{module}/action_view_map.php
- 4、custom/include/MV/Controller/action_view_map.php
- 5、custom/application/Ex/ActionViewMap/action_view_map.ext.php
- 6、custom/modules/{module}/Ex/ActionViewMap/action_view_map.ext.php
- 7、從緩存加載,緩存名錶示爲:CONTROLLER_action_view_map_{module}
- 注1:
此文件只有一個數組變量$action_view_map,格式爲'{action名}' => '{view名}',比如:
$action_view_map['detailview']= 'detail';其涵義爲:detailview動作對應的視圖文件爲view.detail.php - 注2:
加載(require)完後會保存到由CONTROLLER_action_view_map_{module}標識的緩存,方便下次直接從緩存讀取以提高效率。
- 9、加載 action_file_map.php 文件,此值從以下目錄加載,越往下的目錄其優先級越高,即會覆蓋之前的 action_file_map 屬性值
- 1、include/MV/Controller/action_file_map.php
- 2、modules/{module}/action_file_map.php
- 3、custom/modules/{module}/action_file_map.php
- 4、custom/include/MV/Controller/action_file_map.php
- 5、custom/application/Ex/ActionFileMap/action_file_map.ext.php
- 6、custom/modules/{module}/Ex/ActionFileMap/action_file_map.ext.php
- 7、從緩存加載,緩存名錶示爲:CONTROLLER_action_file_map_{module}
- 注1:
此文件只有一個數組變量$action_file_map,格式爲:'{action名}' => '{文件名}',比如:
$action_file_map['save2']= 'include/generic/Save2.php';其涵義爲:save2動作映射到include/generic/Save2.php文件 - 注2:
加載(require)完後會保存到由CONTROLLER_action_file_map_{module}標識的緩存,方便下次直接從緩存讀取以提高效率。
- 10、加載 action_remap.php 文件,此值從以下目錄加載,越往下的目錄其優先級越高,即會覆蓋之前的 action_remap 屬性值
- 1、include/MV/Controller/action_remap.php
- 2、modules/{module}/action_remap.php
- 3、custom/modules/{module}/action_remap.php
- 4、custom/include/MV/Controller/action_remap.php
- 5、custom/application/Ex/ActionRemap/action_remap.ext.php
- 6、custom/modules/{module}/Ex/ActionRemap/action_remap.ext.php
- 7、從緩存加載,緩存名錶示爲:CONTROLLER_action_remap_{module}
- 注1:
此文件只有一個數組變量$action_remap',格式爲:'{action名}' => '{view名}',比如:
$action_remap['detailview']= 'detail';其涵義爲:detailview動作對應的視圖文件爲view.detail.php - 注2:
加載(require)完後會保存到由CONTROLLER_action_remap_{module}標識的緩存,方便下次直接從緩存讀取以提高效率。
- 11、設置 var 屬性值,var屬性值實際是由上面第8、9、10提供的。
(探討請加微信:JiangHuKeyKe)
<?php
require_once('include/MVC/Controller/SugarController.php');
/**
* MVC控制器工廠
* @api
*/
class ControllerFactory{
/**
* 獲取正確控制器的實例。
*
* @return 返回一個控制器實例
*/
function getController($module){
$class = ucfirst($module).'Controller';
$customClass = 'Custom' . $class;
if(file_exists('custom/modules/'.$module.'/controller.php')){
$customClass = 'Custom' . $class;
require_once('custom/modules/'.$module.'/controller.php');
if(class_exists($customClass)){
$controller = new $customClass();
}else if(class_exists($class)){
$controller = new $class();
}
}elseif(file_exists('modules/'.$module.'/controller.php')){
require_once('modules/'.$module.'/controller.php');
if(class_exists($customClass)){
$controller = new $customClass();
}else if(class_exists($class)){
$controller = new $class();
}
}else{
if(file_exists('custom/include/MVC/Controller/SugarController.php')){
require_once('custom/include/MVC/Controller/SugarController.php');
}
if(class_exists('CustomSugarController')){
$controller = new CustomSugarController();
}else{
$controller = new SugarController();
}
}
//setup the controller
$controller->setup($module);
return $controller;
}
}
?>
需要命理預測服務請加微信: