1.4.6关闭控制器复用后,afterAction的代替问题

banro512

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了

195 2 0
2个回答

ichynul

感觉当前对这个acion的前置和后置处理不合适,导致复用控制器与否,框架走了不同的脑回路。
应该统一,一下,放到框架层面处理前置和后置。

$call[0] = static::container($plugin)->get($call[0]);
$controller = $call[0];
$action = $call[1];

if(method_exists($controller),'beforeAction')
{
    $controller->beforeAction();//执行前置方法
}
$controller->$action(...$args);//执行对应方法
if(method_exists($controller),'afterAction')
{
    $controller->beforeAction();//执行后置方法
}

//即保证了执行顺序,又无关控制器是否复用。
//控制器是否复用任然保留,作用仅局限与自动释放控制器里面的资源。

1、复用控制器的情况下,actionHook的中间件执行顺序问题无解,但又没有拿出完美的可行方案,让关闭控制器复用,但又保留可以配置为复用控制器。
2、不复用控制器复用的情况下,其实也不太方便,__construct__destruct的执行也讲时机,比如说__destruct不是本次执行就立刻调用,而是要下次请求进来重新new,旧的控制器才销毁调用__destruct。这就导致你只可以在__destruct销毁控制器里面的资源,如果你想销毁其他地方的静态资源,可能与你想的不一样(顺序)。

  • walkor 16天前

    1、“复用控制器的情况下,actionHook的中间件执行顺序问题无解” 执行顺序有什么问题?
    2、1.4版本不复用控制器时,__destruct 会在请求结束后立刻执行

  • ichynul 16天前

    中间件执行顺序问题,就是使用其他中间件做权限验证,执行beforeAction时可能那个验证的中间件还没执行,如果在beforeAction做一些操作依赖于权限验证结果,就会有问题。这就导致很难配合,要么在自己写的中间件完成所有的东西,要么把权限验证的逻辑放在beforeAction里面。__destruct 这个我试了没问题了。

  • walkor 16天前

    中间件按照配置顺序执行的,权限中间件放在最前面就行了吧

walkor

__destruct 无法获得响应,如果你想获得响应,需要使用中间件。
你可以继续使用action-hook,action-hook在webman 1.4下必须开启控制器复用才能生效

  • 暂无评论
🔝