分享一個Thinkphp Hook行為的使用案例

下面由thinkphp教程欄目給大家介紹一個thinkphp hook行為的使用案例,希望對需要的朋友有所幫助!

分享一個Thinkphp Hook行為的使用案例

thinkphp Hook行為的使用案例

行為,官方是如下介紹: 行為(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行為既可以獨立調用,也可以綁定到某個標簽中進行偵聽,在官方提出的CBD模式中行為也占了主要的地位,可見行為在ThinkPHP框架中意義非凡。

這里指的行為是一個比較抽象的概念,你可以把行為想象成在應用執行過程中的一個動作或者處理。

在框架的執行流程中,例如路由檢測是一個行為,靜態緩存是一個行為,用戶權限檢測也是行為,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。

立即學習PHP免費學習筆記(深入)”;

而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之后,我們把這些行為發生作用的位置稱之為標簽(位),當應用程序運行到這個標簽的時候,就會被攔截下來,統一執行相關的行為,類似于AOP編程中的“切面”的概念,給某一個切面綁定相關行為就成了一種類AOP編程的思想。

使用

行為的定義很簡單,只是在某些場景下的應用,可能有點難以理解。 在 laravel 中, 類似于其事件監聽器, 當觸發了某一行為進行自動觸發相關的操作方法

舉個例子來說

一個登錄的功能,前期我們只需要校驗密碼即可,按照以往的方法可以這樣做

function?checkLogin()?{ ???? ????$this->checkPass(); ???? ????//?--?新增加的功能 ????$this->checkMobile(); ????$this->checkCaptcha(); ????//...?等等 ???? ????echo?'登錄成功'; }

在如上操作中,是不是很麻煩,針對一個登錄行為, 如果后期功能的增加我們需要不斷的去增加功能就必須得去修改控制器代碼

我們進行解耦該怎么做呢?

即將行為,邏輯(鉤子)分離開, 讓代碼更加易于管理

使用如下,我們直接上圖

分享一個Thinkphp Hook行為的使用案例

如上,我們定義了三個不同的即將發生的行為, 分別為連接網絡 、 關閉電腦、使用電腦

//?Connect.php namespace?appindexehavior; class?Connect { ????public?function?run() ????{ ????????echo?'連接網絡'; ????} ????public?function?__destruct() ????{ ????????echo?'<br>'; ????} } //?End.php namespace?appindexehavior; class?End { ????public?function?run() ????{ ????????echo?'關閉電腦'; ????????echo?'<br>'; ????} } //?On.php namespace?appindexehavior; 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(&amp;$param) ????{ ????????$param?=?'結束了'; ????} }

控制器文件 Index.php

namespace?appindexcontroller; ???? ????use?thinkHook; ???? ????class?Index ????{ ????????public?function?__construct() ????????{ ????????????//?開始綁定使用電腦需要進行的操作 ????????????Hook::add('app_init', ????????????????[ ????????????????????'appindexbehaviorOn', ????????????????????'appindexbehaviorConnect', ????????????????] ????????????);?//?批量綁定 ???? ????????????Hook::add('qq',?'appindexbehaviorOn');??//?自定義標簽名 ????????????Hook::add('opBrowser',?'appindexbehaviorOn');?//?自定義標簽名 ????//????????Hook::add('app_end',?'appindexbehaviorEnd');?//?系統標簽位,無需綁定,自動執行 ???? ???? ????????} ???? ????????public?function?index() ????????{ ????????????echo?'我現在需要使用電腦進行社交'; ????????????echo?'<br>'; ???? ????????????Hook::listen('app_init');??//?手動初始化 ???? ????????????Hook::listen('qq');??//?打開qq ???? ????????????Hook::listen('opBrowser');?//?打開瀏覽器 ????????} ????}

? ??

? ??

輸出結果

分享一個Thinkphp Hook行為的使用案例

1) 解析

首先,我們可以在一個全局中,例如控制器初始化中可以使用 Hook::add 開始進行綁定, 綁定完成后就可以使用 Hook::listen() 執行相關綁定的方法,盡量不要使用Listen音譯去理解這個方法

他實際上不算監聽,實際上是運行的意思, 當Listen的時候,會執行相關在前面綁定的方法, 例如 Hook::listen(‘app_init’) 后便會執行 ‘appindexbehaviorOn’, ‘appindexbehaviorConnect’

中的 run 方法

如果 執行的行為標簽 app_init 非系統標簽或者在 appindexbehaviorOn 中有 app_init 方法,則會就會執行其中app_init的方法,而不是執行run

2) 自定義標簽

使用自定義標簽必須滿足兩個條件, 1、Hook::add(‘qq’) 對自定義標簽 qq 進行綁定了, 2、對應的行為類中必須存在 qq 這個方法, 否則自動運行 run 方法

3) tags.php 行為綁定

??//?..tags.php ????<?php               return [         &#39;app_init&#39;=>?[ ????????????'appindexbehaviorOn', ????????????'appindexbehaviorConnect', ????????], ????????'app_end'=&gt;?[ ????????????'appindexbehaviorEnd' ????????] ????];

可以在控制器下目錄下使用 tags.php 進行綁定。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享