行爲,官方是以下介紹: 行爲(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行爲既能夠獨立調用,也能夠綁定到某個標籤中進行偵聽,在官方提出的CBD模式中行爲也佔了主要的地位,可見行爲在ThinkPHP框架中意義非凡。
這裏指的行爲是一個比較抽象的概念,你能夠把行爲想象成在應用執行過程當中的一個動做或者處理。在框架的執行流程中,例如路由檢測是一個行爲,靜態緩存是一個行爲,用戶權限檢測也是行爲,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等均可以當作是一個行爲,甚至說你但願給你的網站用戶的第一次訪問彈出Hello,world!這些均可以當作是一種行爲,行爲的存在讓你無需改動框架和應用,而在外圍經過擴展或者配置來改變或者增長一些功能。php
而不一樣的行爲之間也具備位置共同性,好比,有些行爲的做用位置都是在應用執行前,有些行爲都是在模板輸出以後,咱們把這些行爲發生做用的位置稱之爲標籤(位),當應用程序運行到這個標籤的時候,就會被攔截下來,統一執行相關的行爲,相似於AOP編程中的「切面」的概念,給某一個切面綁定相關行爲就成了一種類AOP編程的思想。laravel
行爲的定義很簡單,只是在某些場景下的應用,可能有點難以理解。 在 laravel 中, 相似於其事件監聽器, 當觸發了某一行爲進行自動觸發相關的操做方法thinkphp
舉個例子來講編程
一個登陸的功能,前期咱們只須要校驗密碼便可,按照以往的方法能夠這樣作瀏覽器
function checkLogin() { $this->checkPass(); // -- 新增長的功能 $this->checkMobile(); $this->checkCaptcha(); //... 等等 echo '登陸成功'; }
在如上操做中,是否是很麻煩,針對一個登陸行爲, 若是後期功能的增長咱們須要不斷的去增長功能就必須得去修改控制器代碼緩存
咱們進行解耦該怎麼作呢?網絡
即將行爲
,邏輯(鉤子)
分離開, 讓代碼更加易於管理app
使用以下,咱們直接上圖框架
如上,咱們定義了三個不一樣的即將發生的行爲, 分別爲鏈接網絡 、 關閉電腦、使用電腦網站
// Connect.php namespace app\index\behavior; class Connect { public function run() { echo '鏈接網絡'; } public function __destruct() { echo '<br/>'; } } // End.php namespace app\index\behavior; class End { public function run() { echo '關閉電腦'; echo '<br/>'; } } // On.php namespace app\index\behavior; class On { public function run() { echo '開啓電腦'; echo '<br/>'; } public function qq() { echo '打開QQ'; echo '<br/>'; } public function opBrowser() { echo '打開瀏覽器'; echo '<br/>'; } public function app_end(&$param) { $param = '結束了'; } }
控制器文件 Index.php
namespace app\index\controller; use think\Hook; class Index { public function __construct() { // 開始綁定使用電腦須要進行的操做 Hook::add('app_init', [ 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect', ] ); // 批量綁定 Hook::add('qq', 'app\\index\\behavior\\On'); // 自定義標籤名 Hook::add('opBrowser', 'app\\index\\behavior\\On'); // 自定義標籤名 // Hook::add('app_end', 'app\\index\\behavior\\End'); // 系統標籤位,無需綁定,自動執行 } public function index() { echo '我如今須要使用電腦進行社交'; echo '<br/>'; Hook::listen('app_init'); // 手動初始化 Hook::listen('qq'); // 打開qq Hook::listen('opBrowser'); // 打開瀏覽器 } }
輸出結果
1) 解析
首先,咱們能夠在一個全局中,例如控制器初始化中可使用 Hook::add
開始進行綁定, 綁定完成後就可使用 Hook::listen()
執行相關綁定的方法,儘可能不要使用Listen音譯去理解這個方法
他實際上不算監聽,其實是運行的意思, 當Listen的時候,會執行相關在前面綁定的方法, 例如 Hook::listen('app_init')
後便會執行 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect'
中的 run
方法
若是 執行的行爲標籤 app_init
非系統標籤或者在 app\\index\\behavior\\On
中有 app_init
方法,則會就會執行其中app_init的方法,而不是執行run
2) 自定義標籤
使用自定義標籤必須知足兩個條件, 一、Hook::add('qq')
對自定義標籤 qq
進行綁定了, 二、對應的行爲類中必須存在 qq
這個方法, 不然自動運行 run
方法
3) tags.php 行爲綁定
// ..tags.php <?php return [ 'app_init'=> [ 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect', ], 'app_end'=> [ 'app\\index\\behavior\\End' ] ];
能夠在控制器下目錄下使用 tags.php
進行綁定