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

thinkphp的CBD模式

核心保留了最關鍵的部分,並在重要位置設置了標籤用以標記,其餘功能都採用行爲擴展和驅動的方式組合,開發人員能夠根據本身的須要,對某個標籤位置進行行爲擴展或者替換,就能夠方便的定製框架底層,也能夠在應用層添加本身的標籤位置和添加應用行爲。而標籤位置相似於AOP概念中的「切面」,行爲都是圍繞這個「切面」來進行編程。php

CBD主要由Core(核心)、Behavior(行爲)以及Drivers(驅動)三部分組成。在ThinkPHP中,Core是指諸如路由配置,基礎模型類、Behavior中使用到的行爲標籤配置這些最重要的核心函數庫、類庫以及配置文件。Behavior是框架中比較關鍵的一種機制,在thinkphp中是實現了「鉤子」的功能,恰當的使用能夠有效下降業務邏輯之間的耦合度,下面會詳細。而Drivers是基於功能的,爲框架的功能拓展提供驅動,好比數據庫驅動,緩存驅動。thinkphp

Behavior(行爲)

AOP

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

AOP(Aspect Oriented Program)與傳統的面向對象編程並不衝突,反而能夠對OOP編程做出補充,增長某些代碼的重用性,下降不一樣業務邏輯之間的耦合度,使團隊開發更爲容易且能夠有效下降開發週期。django

鉤子函數

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

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

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

行爲拓展

行爲(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') ); ?>
相關文章
相關標籤/搜索