中间件
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
定义中间件
php think make:middleware Check
中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。
中间件handle方法的返回值必须是一个Response对象。
当前thinkpghp6的目录结构为多应用模式,所以,将middleware目录和middleware.php 文件拷贝了一份到index应用中
且修改中间件Check 类命名空间
<?php
namespace app\index\middleware;
class Check
{
public function handle($request, \Closure $next)
{
echo '得到name=' . $request->param('name') . '<br>';
if ($request->param('name') == 'qipa250') {
echo '你好我是奇葩250';
} else {
echo '你好我不是奇葩250';
}
echo '<br>';
echo '走到app\index\middleware\Check类的handle方法了';
return $next($request);
}
}
配置中间件
在app/middleware.php或者app/admin/middleware.php里添加如下代码:
<?php
return [
app\index\middleware\Check::class,
];
访问index控制器中的hello方法
public function hello($name = 'ThinkPHP6')
{
echo $name;
}
不传入name的值 打印结果如下
传入name的值为qipa250 打印结果如下:
前置/后置中间件
中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身
前置行为的中间件
//关键代码
$next($request);
中间件Check.php代码
<?php
namespace app\index\middleware;
class Check
{
public function handle($request, \Closure $next)
{
echo '得到name=' . $request->param('name') . '<br>';
if ($request->param('name') == 'qipa250') {
echo '你好我是奇葩250';
} else {
echo '你好我不是奇葩250';
}
echo '<br>';
echo '走到app\index\middleware\Check类的handle方法了';
return $next($request);
}
}
控制器中hello的方法
public function hello($name = 'ThinkPHP6')
{
echo '<br>我是hello方法的name=' . $name;
}
我们访问hello方法时,发现,优先执行的是中间件中的内容,最后才打印了hello方法中的内容
后置行为的中间件
新建中间件After
<?php
namespace app\index\middleware;
class After
{
public function handle($request, \Closure $next)
{
//定义一个变量HOME_NAME
define('HOME_NAME', '奇葩天地网');
$response = $next($request);
return $response;
}
}
引入中间件
<?php
return [
// app\index\middleware\Check::class,
app\index\middleware\After::class,
];
控制器的hello方法
public function hello($name = 'ThinkPHP6')
{
echo HOME_NAME;
echo '<br>我是hello方法的name=' . $name;
}
可以正常打印
若是修改位置
<?php
namespace app\index\middleware;
class After
{
public function handle($request, \Closure $next)
{
$response = $next($request);
//放到后置执行
define('HOME_NAME', '奇葩天地网');
return $response;
}
}
则报错,因为他找不到HOME_NAME这个变量
中间件向控制器传参
可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如
<?php
namespace app\index\middleware;
class After
{
public function handle($request, \Closure $next)
{
$request->name='奇葩天地网';
$response = $next($request);
return $response;
}
}
控制器中
public function hello(Request $request,$name = 'ThinkPHP6')
{
echo 'name'.$request->name;
echo '<br>我是hello方法的name=' . $name;
}
内置中间件
新版内置了几个系统中间件,包括:
中间件类 描述
think\middleware\AllowCrossDomain 跨域请求支持
think\middleware\CheckRequestCache 请求缓存
think\middleware\LoadLangPack 多语言加载
think\middleware\SessionInit Session初始化
think\middleware\TraceDebug 页面Trace支持
这些内置中间件默认都没有定义,你可以在应用的middleware.php文件中、路由或者控制器中定义这些中间件,如果不需要使用的话,取消定义即可。