ThinkPHP3.1 行爲擴展Behavior,tags標籤位

thinkphp 現在流行的兩個版本:TP3.1,TP3.2。

兩個版本在行爲擴展方面採用不同的表現形式。其中TP3.2引入了鉤子插件的形式,可以定義插件控制器;TP3.1採用的是tag('app_begin')
以下是3.1的行爲擴展:

一:執行流程:PHP程序以順序的方式執行,每點擊一個連接,將從入口文件或起始文件執行。
(1):文件流程: 【1】/index.php入口文件–>
【2】/ThinkPHP/ThinkPHP.php–>
【3】/ThinkPHP/Common/runtime.php—>
【4】/ThinkPHP/Core/Think.class.php::start();–>
【5】/ThinkPHP/Core/App.class.php::run();
一次執行的大體流程在執行完run()方法就結束了。
(2):代碼流程
看一下run方法的具體內容:

/**
     * 運行應用實例 入口文件使用的快捷方法
     * @access public
     * @return void
     */
    static public function run() {
        // 項目初始化標籤
        tag('app_init');

        App::init();
        // 項目開始標籤
        tag('app_begin');

        // Session初始化
        session(C('SESSION_OPTIONS'));
        // 記錄應用初始化時間
        G('initTime');
        App::exec();
        // 項目結束標籤
        tag('app_end');
        return ;
    }

這裏我們看到多次調用了同一個方法:tag();這個tag方法就是用來執行行爲擴展(處理標籤擴展)的。在tag方法中有幾個地方值得看一下:

 // 系統標籤擴展
    $extends    = C('extends.' . $tag);
    // 應用標籤擴展
    $tags       = C('tags.' . $tag);

這段代碼用戶讀取在配置文件中我們定義的擴展和系統內置的一些行爲(如:路由檢測,讀取靜態緩存,自動定位模板…),這樣我們在tags.php配置文件中定義的行爲擴展纔會有用;

B($name, $params);//執行擴展

這纔是真正的關鍵:看一下function B就明白了:

/**
 * 執行某個行爲
 * @param string $name 行爲名稱
 * @param Mixed $params 傳人的參數
 * @return void
 */
function B($name, &$params=NULL) {
    $class      = $name.'Behavior';
    if(APP_DEBUG) {
        G('behaviorStart');
    }
    $behavior   = new $class();
    $behavior->run($params);
    if(APP_DEBUG) { // 記錄行爲的執行日誌
        G('behaviorEnd');
        trace('Run '.$name.' Behavior [ RunTime:'.G('behaviorStart','behaviorEnd',6).'s ]','','INFO');
    }
}

new $class();把自己寫的行爲類實例化了,並執行了run();run的運行在處理業務邏輯。

二:應用:
那麼問題來了:這個行爲擴展有什麼用呢?
這裏舉一個實例:比如權限管理,一個管理系統的權限管理,在後臺管理中一些人可以用某個模塊,一些人不能用某個模塊。我們是不是可以在Controller或Action中開處理,在Controller的初始化時處理,在執行某個方法之前做一些處理呢。

看一些系統提供的標籤位:這裏就有兩個這樣的標籤位:(1):action_name 操作方法名標籤位
(2):action_begin 控制器開始標籤位
action_begin 標籤位被放置在Action.class.php 的初始化函數中

 /**
     * 架構函數 取得模板對象實例
     * @access public
     */
    public function __construct() {
        tag('action_begin',$this->config);
        //實例化視圖類
        $this->view     = Think::instance('View');           
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
    }

這樣當我們的一個模塊在被執行時你想要添加權限,只要在conf文件中添加tags.php文件的配置項就可以,然後添加行爲擴展類即可:如:
在tags.php中可以這樣定義:

<?php
 /* ---------------------------------------
    添加行爲
  ----------------------------------------*/
return array(
     'action_begin' => array('AuthCheck'),
 );
 ?>

當執行到tag(‘action_begin’,$this->config);這樣的方法時:就會去查找相應的Behavior類了
TP3.1默認行爲擴展文件存放在:項目目錄的Lib/Behavior目錄下面。
建一個class AuthCheckBehavior extends Behavior 這樣的繼承Behavior 類再重寫run方法就可了。

三:總結:
(只是以我現在的水平來說)PHP執行總是按照流程來的,突然冒出來的任何東西或功能,都是在莫個地方被調用了,而且總是按照線性的形式來調用,最後總會匯合到一起結束。當我們看到一些新的東西,我們首先改有的不是畏懼,而是應該找出現這樣的原因。有些時候不是我們不懂,只不過是經過了別人的封裝而已。


其中若有錯誤,請指正,此爲學習筆記

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