可以通过命令行指令快速生成中间件
//单应用创建中间件
php think make:middleware Check
//多应用创建中间件
php think make:middleware Index@Check
指令会在你指定的目录下创建一个 middleware
目录,生成一个叫Check
中间件
<?php
namespace app\middleware;
class Check
{
public function handle($request, \Closure $next)
{
return $next($request);
}
}
中间件的入口执行方法必须是handle
方法,而且第一个参数是Request
对象,第二个参数是一个闭包;创建成功时会自动生成
中间件还分前后置
中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。
前置中间件:
<?php
namespace app\middleware;
class Before
{
public function handle($request, \Closure $next)
{
// 添加中间件执行代码
return $next($request);
}
}
后置中间件:
<?php
namespace app\middleware;
class After
{
public function handle($request, \Closure $next)
{
$response = $next($request);
// 添加中间件执行代码
return $response;
}
}
在ThinkPHP5.1以上的版本中,前置中间件和后置中间件是有区别的,前置中间件获取不到控制器的名称和方法名称,后置中间件是可以获取到的,但是在新的ThinkPHP中做了修改,唯一区别变成了是否能获取到执行的路由
在中间件中可以做防翻墙操作:
<?php
namespace app\goods\middleware;
class UserCheck
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
//判断session中是否有值
if (!session('username')) {
return redirect('login');
}
return $next($request);
}
}
session在ThinkPHP6中是未开启的,需要注册开启:
在middleware.php中添加
<?php
// 这是系统自动生成的middleware定义文件
return [
'think\middleware\SessionInit'
];