1.4.6關(guān)閉控制器復(fù)用后,beforeAction 可以簡單的直接使用 ``__construct``` 了
但之前在 afterAction 里的一些操作,要如何替換呢,使用 __destruct
嗎?那在這里如果獲取 Response響應(yīng)內(nèi)容呢?
比如 之前要存儲靜態(tài)html內(nèi)容,在afterAction
里可以直接在 afterAction(Request $request, $response)
獲取到 $response ,然后保存為html文件即可。
/**
* 保存純靜態(tài)文件
*/
public function afterAction(Request $request, $response)
{
if (!empty($response->dirpath) && !empty($response->htmlfile)) {
try {
// 創(chuàng)建目錄
!is_dir($response->dirpath) && mkdir($response->dirpath, 0755, true);
// 保存靜態(tài)文件
file_put_contents($response->dirpath . '/' . $response->htmlfile, $response->rawBody());
} catch (\Throwable $e) {
// 忽略錯(cuò)誤
}
}
}
現(xiàn)在如果關(guān)閉了控制器復(fù)用,不再使用actionHook
插件,怎么在 __destruct
里實(shí)現(xiàn)呢?還是得使用中間件來實(shí)現(xiàn)吧,這種需求也就不必要關(guān)閉復(fù)用,放棄actionhook了
感覺當(dāng)前對這個(gè)acion的前置和后置處理不合適,導(dǎo)致復(fù)用控制器與否,框架走了不同的腦回路。
應(yīng)該統(tǒng)一,一下,放到框架層面處理前置和后置。
$call[0] = static::container($plugin)->get($call[0]);
$controller = $call[0];
$action = $call[1];
if(method_exists($controller),'beforeAction')
{
$controller->beforeAction();//執(zhí)行前置方法
}
$controller->$action(...$args);//執(zhí)行對應(yīng)方法
if(method_exists($controller),'afterAction')
{
$controller->beforeAction();//執(zhí)行后置方法
}
//即保證了執(zhí)行順序,又無關(guān)控制器是否復(fù)用。
//控制器是否復(fù)用任然保留,作用僅局限與自動(dòng)釋放控制器里面的資源。
1、復(fù)用控制器的情況下,actionHook
的中間件執(zhí)行順序問題無解,但又沒有拿出完美的可行方案,讓關(guān)閉控制器復(fù)用,但又保留可以配置為復(fù)用控制器。
2、不復(fù)用控制器復(fù)用的情況下,其實(shí)也不太方便,__construct
、__destruct
的執(zhí)行也講時(shí)機(jī),比如說__destruct
不是本次執(zhí)行就立刻調(diào)用,而是要下次請求進(jìn)來重新new,舊的控制器才銷毀調(diào)用__destruct
。這就導(dǎo)致你只可以在__destruct
銷毀控制器里面的資源,如果你想銷毀其他地方的靜態(tài)資源,可能與你想的不一樣(順序)。
1、“復(fù)用控制器的情況下,actionHook的中間件執(zhí)行順序問題無解” 執(zhí)行順序有什么問題?
2、1.4版本不復(fù)用控制器時(shí),__destruct 會在請求結(jié)束后立刻執(zhí)行
中間件執(zhí)行順序問題,就是使用其他中間件做權(quán)限驗(yàn)證,執(zhí)行beforeAction時(shí)可能那個(gè)驗(yàn)證的中間件還沒執(zhí)行,如果在beforeAction做一些操作依賴于權(quán)限驗(yàn)證結(jié)果,就會有問題。這就導(dǎo)致很難配合,要么在自己寫的中間件完成所有的東西,要么把權(quán)限驗(yàn)證的邏輯放在beforeAction里面。__destruct 這個(gè)我試了沒問題了。