thinkphp 面向切面編程-行為拓展

來源:互聯網
上載者:User

標籤:重要   女人   str   定位   ams   code   sse   傳遞   瀏覽器   

thinkphp的CBD模式

核心保留了最關鍵的部分,並在重要位置設定了標籤用以標記,其他功能都採用行為擴充和驅動的方式組合,開發人員可以根據自己的需要,對某個標籤位置進行行為擴充或者替換,就可以方便的定製架構底層,也可以在應用程式層添加自己的標籤位置和添加應用行為。而標籤位置類似於AOP概念中的“切面”,行為都是圍繞這個“切面”來進行編程。

CBD主要由Core(核心)、Behavior(行為)以及Drivers(驅動)三部分組成。在ThinkPHP中,Core是指諸如路由配置,基本模型類、Behavior中使用到的行為標籤配置這些最重要的核心函數庫、類庫以及設定檔。Behavior是架構中比較關鍵的一種機制,在thinkphp中是實現了“鉤子”的功能,恰當的使用可以有效降低商務邏輯之間的耦合度,下面會詳細。而Drivers是基於功能的,為架構的功能拓展提供驅動,比如資料庫驅動,緩衝驅動。

Behavior(行為)AOP

這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程 http://hejiajunsh.iteye.com/blog/1776569

AOP(Aspect Oriented Program)與傳統的物件導向編程並不衝突,反而可以對OOP編程作出補充,增加某些代碼的重用性,降低不同商務邏輯之間的耦合度,使團隊開發更為容易且可以有效降低開發週期。

鉤子函數

鉤子是編程裡一個常見概念,非常的重要。它使得系統變得非常容易拓展,(而不用理解其內部的實現機理,這樣可以減少很多工作量)。
可以理解為當一個玻璃球從空中落下,即將砸到人的時候,有個事件會提前發生.例如告訴那個被砸的人,球已經在下落過程中,
告訴就是一個事件,一個鉤子,我們可以針對不同的人做出不同的相應,如果是男人我們告訴他這個球砸到人不疼,如果是女人則告訴她很疼;

鉤子函數可以截獲並處理其他應用程式的訊息。每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。

設定鉤子的過程其實就是設定事件驅動的過程,簡單來講就是定義鉤子函數,註冊事件,監聽(掛載),滿足觸發條件並觸發鉤子函數。

行為拓展

行為(Behavior)是ThinkPHP擴充機制中比較關鍵的一項擴充,行為既可以獨立調用,也可以綁定到某個標籤(位)中進行偵聽。這裡的行為指的是一個比較抽象的概念,你可以想象成在應用執行過程中的一個動作或者處理,在架構的執行流程中,各個位置都可以有行為產生,例如路由檢測是一個行為,靜態緩衝是一個行為,使用者權限檢測也是行為,大到商務邏輯,小到瀏覽器檢測、多語言偵測等等都可以當做是一個行為,甚至說你希望給你的網站使用者的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動架構和應用,而在外圍通過擴充或者配置來改變或者增加一些功能。

換言之,TP架構中Behavior實現了AOP(面向切面)編程,即綁定標籤,利用Hook函數設定觸發點。

行為拓展添加過程
  • 建立Behavior類

可以直接放在Think\Behaviors中,也可以放在應用目錄中(Application\Common\Behavior),建立檔案,命名格式為 標籤名+Behavior.class.PHP 。要注意類中必須含有run方法,預設run方法為入口方法。

代碼內容

namespace Common\Behavior;use Think\Behavior;class TolldetectBehavior extends Behavior{    //方法名必須為run,作為入口檔案    public function run(&$param){        echo "Hello ";    }}
  • 註冊標籤(掛載)
    ThinkPHP中的標籤註冊方法有兩種,一種是手動註冊,一種是自動註冊。

下面為手動註冊方法add()的源碼

/**     * 動態添加外掛程式到某個標籤     * @param string $tag 標籤名稱     * @param mixed $name 外掛程式名稱     * @return void     */    static public function add($tag,$name) {        if(!isset(self::$tags[$tag])){            self::$tags[$tag]   =   array();        }        if(is_array($name)){            self::$tags[$tag]   =   array_merge(self::$tags[$tag],$name);        }else{            self::$tags[$tag][] =   $name;        }    }

我們在調用時用Hook::add($tags,$name)就可以綁定。注意tags為要綁定的標籤名,$name為具體的behavior行為檔案。

如果使用自動註冊,則需要在Common目錄下建立tags.php檔案。其中可以直接通過返回數組的方法進行大量繫結,TP在運行中會自動載入這個配置並進行綁定。例如:

<?php return array(    "action_begin" => array(‘Home\\Behaviors\\testBehavior‘)); ?>

thinkphp 面向切面編程-行為拓展

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.