1.4.6关闭控制器复用后,beforeAction 可以简单的直接使用 ``__construct``` 了
但之前在 afterAction 里的一些操作,要如何替换呢,使用 __destruct
吗?那在这里如果获取 Response响应内容呢?
比如 之前要存储静态html内容,在afterAction
里可以直接在 afterAction(Request $request, $response)
获取到 $response ,然后保存为html文件即可。
/**
* 保存纯静态文件
*/
public function afterAction(Request $request, $response)
{
if (!empty($response->dirpath) && !empty($response->htmlfile)) {
try {
// 创建目录
!is_dir($response->dirpath) && mkdir($response->dirpath, 0755, true);
// 保存静态文件
file_put_contents($response->dirpath . '/' . $response->htmlfile, $response->rawBody());
} catch (\Throwable $e) {
// 忽略错误
}
}
}
现在如果关闭了控制器复用,不再使用actionHook
插件,怎么在 __destruct
里实现呢?还是得使用中间件来实现吧,这种需求也就不必要关闭复用,放弃actionhook了
感觉当前对这个acion的前置和后置处理不合适,导致复用控制器与否,框架走了不同的脑回路。
应该统一,一下,放到框架层面处理前置和后置。
1、复用控制器的情况下,
actionHook
的中间件执行顺序问题无解,但又没有拿出完美的可行方案,让关闭控制器复用,但又保留可以配置为复用控制器。2、不复用控制器复用的情况下,其实也不太方便,
__construct
、__destruct
的执行也讲时机,比如说__destruct
不是本次执行就立刻调用,而是要下次请求进来重新new,旧的控制器才销毁调用__destruct
。这就导致你只可以在__destruct
销毁控制器里面的资源,如果你想销毁其他地方的静态资源,可能与你想的不一样(顺序)。1、“复用控制器的情况下,actionHook的中间件执行顺序问题无解” 执行顺序有什么问题?
2、1.4版本不复用控制器时,__destruct 会在请求结束后立刻执行
中间件执行顺序问题,就是使用其他中间件做权限验证,执行beforeAction时可能那个验证的中间件还没执行,如果在beforeAction做一些操作依赖于权限验证结果,就会有问题。这就导致很难配合,要么在自己写的中间件完成所有的东西,要么把权限验证的逻辑放在beforeAction里面。__destruct 这个我试了没问题了。
中间件按照配置顺序执行的,权限中间件放在最前面就行了吧
__destruct
无法获得响应,如果你想获得响应,需要使用中间件。你可以继续使用action-hook,action-hook在webman 1.4下必须开启控制器复用才能生效