行為(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行為既可以獨立調用,也可以綁定到某個標簽中進行偵聽,在官方提出的CBD模式中行為也占了主要的地位,可見行為在ThinkPHP框架中意義非凡。
這里指的行為是一個比較抽象的概念,你可以把行為想象成在應用執行過程中的一個動作或者處理。在框架的執行流程中,例如路由檢測是一個行為,靜態緩存是一個行為,用戶權限檢測也是行為,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。
而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之后,我們把這些行為發生作用的位置稱之為標簽(位),當應用程序運行到這個標簽的時候,就會被攔截下來,統一執行相關的行為,類似於AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的思想。
看完官方文檔這段話后會有一點小明白,但還是很糊塗。我理解的就是鈎子行為類似laravel 框架中的中間件,可以用權限驗證的這個行為來比喻,比如用戶做修改操作時,需要驗證這個用戶是不是有權限這個行為。
簡單使用: 模塊目錄下的behavior 下創建一個類,這個類就是鈎子,而類里的方法就是行為,一個鈎子可以有多個行為。
namespace app\common\behavior;
class Test
{
public function test(&$request){
echo 'hello test';
}
public function run(){
echo '我試run方法';
}
}
那要如何使用呢? 有兩種方法
1 可以在模塊下建立app或模塊目錄下建立tags.php 進行綁定,綁定代碼如下。紅色部分是我自定義的綁定行為。
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 應用行為擴展定義文件
return [
// 應用初始化
'app_init' => [],
// 應用開始
'app_begin' => [],
// 應用調度
'app_dispatch' => [
'app\\common\\behavior\\Common',
],
// 模塊初始化
'module_init' => [
'app\\common\\behavior\\Common',
],
// 插件開始
'addon_begin' => [
'app\\common\\behavior\\Common',
],
'run' => [
'app\\common\\behavior\\Test',
],
'test' =>[
'app\\common\\behavior\\Test',
],
// 操作開始執行
'action_begin' => [],
// 視圖內容過濾
'view_filter' => [],
// 日志寫入
'log_write' => [],
// 應用結束
'app_end' => [],
];
這里的鍵相當於鈎子中注冊的行為方法,key指定鈎子文件
鈎子中默認執行run方法。
調用: 注意listen 方法返回的是數組
\think\Hook::listen('test'); // 輸出 hello testArray ( [0] => )
