SugarCRM之ControllerFactory類分析


  • 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;
    }
    
}
?>

需要命理預測服務請加微信:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章