action-hook插件

簡(jiǎn)介
在傳統(tǒng)框架中,每個(gè)請(qǐng)求都會(huì)實(shí)例化一次控制器,所以很多開發(fā)者__construct()
方法中做一些請(qǐng)求前的準(zhǔn)備工作。
而webman由于控制器常駐內(nèi)存,無(wú)法在__construct()
里做這些工作。此插件提供了更好的解決方案beforeAction() afterAction(),它不僅讓開發(fā)者可以介入到請(qǐng)求前的流程中,而且還可以介入到請(qǐng)求后的處理流程中。
特別注意
webman>=1.4.0,不需要安裝此插件,可以在config/app.php
里設(shè)置'controller_reuse' => false
關(guān)閉控制器復(fù)用,讓每個(gè)請(qǐng)求都重新初始化控制器,這樣每個(gè)請(qǐng)求都會(huì)執(zhí)行控制器的__construct()
方法。
webman>=1.4.0時(shí),在關(guān)閉控制器復(fù)用的情況下,本插件將無(wú)法使用。注意
插件需要webman>=1.2,如果你的版本低于1.2可以參考這里手動(dòng)配置action-hook
安裝
composer require webman/action-hook
使用
<?php
namespace app\controller;
use support\Request;
class Index
{
/**
* 該方法會(huì)在請(qǐng)求前調(diào)用
*/
public function beforeAction(Request $request)
{
echo 'beforeAction';
// 若果想終止執(zhí)行Action就直接返回Response對(duì)象,不想終止則無(wú)需return
// return response('終止執(zhí)行Action');
}
/**
* 該方法會(huì)在請(qǐng)求后調(diào)用
*/
public function afterAction(Request $request, $response)
{
echo 'afterAction';
// 如果想串改請(qǐng)求結(jié)果,可以直接返回一個(gè)新的Response對(duì)象
// return response('afterAction');
}
public function index(Request $request)
{
return response('index');
}
}
beforeAction說(shuō)明
- 在當(dāng)前控制器被執(zhí)行前調(diào)用
- 框架會(huì)傳遞一個(gè)
Request
對(duì)象給beforeAction
,開發(fā)者可以從中獲得用戶輸入 - 如需終止執(zhí)行當(dāng)前控制器,則只需要在
beforeAction
里返回一個(gè)Response
對(duì)象,比如return redirect('/user/login');
- 無(wú)需終止執(zhí)行當(dāng)前控制器時(shí),不要返回任何數(shù)據(jù)
afterAction說(shuō)明
- 在當(dāng)前控制器被執(zhí)行后調(diào)用
- 框架會(huì)傳遞
Request
對(duì)象以及Response
對(duì)象給afterAction
,開發(fā)者可以從中獲得用戶輸入以及控制器執(zhí)行后返回的響應(yīng)結(jié)果 - 開發(fā)者可以通過(guò)
$response->rawBody()
獲得響應(yīng)內(nèi)容 - 開發(fā)者可以通過(guò)
$response->getHeader()
獲得響應(yīng)的header頭 - 開發(fā)者可以通過(guò)
$response->getStatusCode()
獲得響應(yīng)的http狀態(tài)碼 - 開發(fā)者可利用
$response->withBody()
$response->header()
$response->withStatus()
串改響應(yīng),也可以創(chuàng)建并返回一個(gè)新的Response
對(duì)象替代原響應(yīng)
特別注意
aciton-hook是基于中間件開發(fā)的,action-hook會(huì)注冊(cè)一個(gè)全局中間件,根據(jù)中間件執(zhí)行順序,action-hook中間件會(huì)優(yōu)先于你的應(yīng)用中間件執(zhí)行,這可能與開發(fā)者預(yù)期不符,解決辦法是手動(dòng)將/config/plugin/action-hook/middleware.php中的中間件配置移動(dòng)到config/middleware.php的對(duì)應(yīng)的應(yīng)用中間件配置末尾。