中间件
中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。
定义中间件
php think make:middleware Check
中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。
中间件handle方法的返回值必须是一个Response对象。
当前thinkpghp6的目录结构为多应用模式,所以,将middleware目录和middleware.php 文件拷贝了一份到index应用中
且修改中间件Check 类命名空间
<?phpnamespace 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里添加如下代码:
<?phpreturn [app\index\middleware\Check::class,];
访问index控制器中的hello方法
public function hello($name = 'ThinkPHP6'){ echo $name;}
不传入name的值 打印结果如下
传入name的值为qipa250 打印结果如下:
前置/后置中间件
中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身
前置行为的中间件
//关键代码$next($request);
中间件Check.php代码
<?phpnamespace 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
<?phpnamespace app\index\middleware;class After{public function handle($request, \Closure $next){//定义一个变量HOME_NAMEdefine('HOME_NAME', '奇葩天地网');$response = $next($request);return $response;}}
引入中间件
<?phpreturn [ // app\index\middleware\Check::class,app\index\middleware\After::class,];
控制器的hello方法
public function hello($name = 'ThinkPHP6'){echo HOME_NAME;echo '<br>我是hello方法的name=' . $name;}
可以正常打印
若是修改位置
<?phpnamespace app\index\middleware;class After{public function handle($request, \Closure $next){$response = $next($request);//放到后置执行define('HOME_NAME', '奇葩天地网');return $response;}}
则报错,因为他找不到HOME_NAME这个变量
中间件向控制器传参
可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如
<?phpnamespace 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文件中、路由或者控制器中定义这些中间件,如果不需要使用的话,取消定义即可。