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

来源:http://www.cnblogs.com/augurG/archive/2017/07/23/7225494.html
-Advertisement-
Play Games

thinkphp的CBD模式 核心保留了最關鍵的部分,併在重要位置設置了標簽用以標記,其他功能都採用行為擴展和驅動的方式組合,開發人員可以根據自己的需要,對某個標簽位置進行行為擴展或者替換,就可以方便的定製框架底層,也可以在應用層添加自己的標簽位置和添加應用行為。而標簽位置類似於AOP概念中的“切麵 ...


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函數設置觸發點。

tp提供了諸如'app_init'(應用初始化標簽位),'path_info'(path_info檢測標簽位),'app_began'(應用開始標簽位),'app_end'(應用結束標簽位)等內置標簽位。

行為拓展添加過程

  • 創建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(
    "hellow" => array('Home\\Behaviors\\TolldetectBehavior')
);
 ?>

以上代碼就完成了'hellow'標簽與我上面定義的事件的自動註冊。
當我們手動或自動完成了行為拓展的綁定,就可以設置事件的觸發點了。
觸發鉤子則會執行run方法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Numpy指南筆記 第2章:Numpy基礎 創建多維數組# coding:utf-8import numpy as npm=np.array([np.arange(2),np.arange(2)])print mprint m.shape 一維數組切片和索引# coding:utf-8import ...
  • 流 數據流 用於傳輸數據。IO流 Input/Output流。數據從外部流向程式 輸入流;數據從程式流向外部的時候--輸出流。讀取一個文件 數據從文件流向程式 輸入流;向一個文件中寫入數據 數據從程式流向文件 輸出流 根據數據流動的方向:輸入流/輸出流 根據數據傳輸的形式:位元組流/字元流 輸入流 輸 ...
  • 要求: Readme: 運行程式,輸入薪水,根據商品列表的序號選擇購買的商品,可以選擇多次購買,或者不購買 流程圖: 代碼: ...
  • #列印實心菱形,思路:分上下,i控制行,j控制列印的空格數,k控制列印的*數量row = int(input("please input a raw number: "))for i in range(row): #i控制行數 for j in range(row-1-i):#空格數和行數的關係 p ...
  • XML文件處理 XML文件處理,有好幾種方式,這裡介紹一下xml.etree.ElementTree as ET。 註意:xml.etree.ElementTree模塊在應對惡意結構數據時顯得並不安全。 每個element對象都具有以下屬性: 1. tag:string對象,表示數據代表的種類; 2 ...
  • 一.ServletContext 介面(javax.servlet)定義:public interface ServletContext原理: Tomcat啟動的時候,需要識別webapps下的各個WEB應用,識別各個WEB應用的同時為每個WEB應用創建對應的對象ServletContext,一個W... ...
  • 最近在做ProtoBuf相關的項目,其中用到了動態解析,網上看了下相關資料和博文都比較少,自己來寫一個記錄一下學習過程。 Protocol Buffers是結構化數據格式標準,提供序列化和反序列方法,用於存儲和交換。語言中立,平臺無關、可擴展。目前官方提供了C++、Java、Python API,也 ...
  • 設計模式之單列模式 1,何為單列模式? 即singleton 在某個類採用了單列模式之後 其只能有一個實列對象 ,並且這個實列對象只能有內部自己創建並提供給外部的調用。 2.實現單列模式的方法 分為 :餓漢式 ,懶漢式 下麵為餓漢式實現代碼: 餓漢式 通過創建一個靜態成員變數 在類載入的時候直接創建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...