您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
webman-控制器-控制器钩子 beforeAction() afterAction()与中间件
发布时间:2022-01-18 22:20:53编辑:雪饮阅读()
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对象替代原响应
webman中控制器的前置与后置方法beforeAction()与afterAction()需要配合中间件一起使用
建立控制器如:
\app\controller\Foo.php:
<?php
namespace app\controller;
use support\Request;
class Foo
{
/**
* 该方法会在请求前调用
*/
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('hello index');
}
}
中间件建立如:
\app\middleware\ActionHook.php:
<?php
namespace app\middleware;
use support\Container;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class ActionHook implements MiddlewareInterface
{
public function process(Request $request, callable $next) : Response
{
if ($request->controller) {
// 禁止直接访问beforeAction afterAction
if ($request->action === 'beforeAction' || $request->action === 'afterAction') {
return response('<h1>404 Not Found</h1>', 404);
}
$controller = Container::get($request->controller);
if (method_exists($controller, 'beforeAction')) {
$before_response = call_user_func([$controller, 'beforeAction'], $request);
if ($before_response instanceof Response) {
return $before_response;
}
}
$response = $next($request);
if (method_exists($controller, 'afterAction')) {
$after_response = call_user_func([$controller, 'afterAction'], $request, $response);
if ($after_response instanceof Response) {
return $after_response;
}
}
return $response;
}
return $next($request);
}
}
然后中间件配置:\config\middleware.php:
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
//空键名并不是意外,若直接不提供该键,则会报错
''=>[
app\middleware\ActionHook::class,
]
];
实例访问如:
[root@localhost wwwroot]# elinks http://192.168.31.53:8787/foo --dump
hello index
关键字词:webman,控制器,控制器钩子,beforeAction,afterAction,中间件