action-hook插件
v1.0.2
版本
2022-09-06
版本更新时间
4003
安装
5
star
简介
在传统框架中,每个请求都会实例化一次控制器,所以很多开发者__construct()
方法中做一些请求前的准备工作。
而webman由于控制器常驻内存,无法在__construct()
里做这些工作。此插件提供了更好的解决方案beforeAction() afterAction(),它不仅让开发者可以介入到请求前的流程中,而且还可以介入到请求后的处理流程中。
特别注意
webman>=1.4.0,不需要安装此插件,可以在config/app.php
里设置'controller_reuse' => false
关闭控制器复用,让每个请求都重新初始化控制器,这样每个请求都会执行控制器的__construct()
方法。
webman>=1.4.0时,在关闭控制器复用的情况下,本插件将无法使用。注意
插件需要webman>=1.2,如果你的版本低于1.2可以参考这里手动配置action-hook
安装
composer require webman/action-hook
使用
<?php
namespace app\controller;
use support\Request;
class Index
{
/**
* 该方法会在请求前调用
*/
public function beforeAction(Request $request)
{
echo 'beforeAction';
// 若果想终止执行Action就直接返回Response对象,不想终止则无需return
// return response('终止执行Action');
}
/**
* 该方法会在请求后调用
*/
public function afterAction(Request $request, $response)
{
echo 'afterAction';
// 如果想串改请求结果,可以直接返回一个新的Response对象
// return response('afterAction');
}
public function index(Request $request)
{
return response('index');
}
}
beforeAction说明
- 在当前控制器被执行前调用
- 框架会传递一个
Request
对象给beforeAction
,开发者可以从中获得用户输入 - 如需终止执行当前控制器,则只需要在
beforeAction
里返回一个Response
对象,比如return redirect('/user/login');
- 无需终止执行当前控制器时,不要返回任何数据
afterAction说明
- 在当前控制器被执行后调用
- 框架会传递
Request
对象以及Response
对象给afterAction
,开发者可以从中获得用户输入以及控制器执行后返回的响应结果 - 开发者可以通过
$response->rawBody()
获得响应内容 - 开发者可以通过
$response->getHeader()
获得响应的header头 - 开发者可以通过
$response->getStatusCode()
获得响应的http状态码 - 开发者可利用
$response->withBody()
$response->header()
$response->withStatus()
串改响应,也可以创建并返回一个新的Response
对象替代原响应
特别注意
aciton-hook是基于中间件开发的,action-hook会注册一个全局中间件,根据中间件执行顺序,action-hook中间件会优先于你的应用中间件执行,这可能与开发者预期不符,解决办法是手动将/config/plugin/action-hook/middleware.php中的中间件配置移动到config/middleware.php的对应的应用中间件配置末尾。