Laravel - 中间件
Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。
就是 用户请求 -> 中间件 -> 请求 or 控制器
比如 :
A. 有一个后台,你要是后台用户才可以访问, 那就要验证身份,后台所有功能都要检测这一步,那这个时候
就可以有一个全局中间件 , ‘Auth’;
B. 比如 API LOG 记录,每次请求了什么API, 提交的数据是什么,都可以在中间件中完成。
也可以防止出现双入口之类的API功能限制。
C. 有一个模块,只有某个特定的用户才可以操作方法, 也可以写一个专门的中间件给这个模块,局部的中间件
个人理解上来说,中间件就类似于YII 中的 beforeAction()
在做某逻辑工作前的预先判断。
[ 创建中间件 ]
我们可以使用 php artisan make:middleware middleward-name指令来创建中间件
使用完这条指令之后,就可以在 app/Http/Middleware中看到新建立的中间件了。
假如我们创建了一个 checkBelt 中间件
<?php
namespace App\Http\Middleware;
use Closure;
class CheckBelt
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if( $request->is('example6') ) {
return redirect('example1');
}
return $next($request);
}
}
如果访问的网址是 /example6, 那就重新定位到 /example1 中去。
[ 注册中间件 ]
想要使用上 checkBelt 这个中间件,那我们就需要在 kernel.php 中进行注册
<?php
...
protected $routeMiddleware = [
//原来就有的哦
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//新注册 checkBelt 中间件!
'belt' => \App\Http\Middleware\CheckBelt::class,
];
...
?>
当我们在 kernel.php 中完成注册时候,我们就可以在Route 中调用了,
//修改一下路由,添加个调用中间件的连接方法。
Route::get('/example6',function(){
$str = 'Hensin';
return $str;
})->name('Hensin')->middleware('belt');
这个时候再去访问 example6, 就会被重定向去example1了。
[ 注册全局中间件 ]
<?php
...
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
//填写到这里
];
...
?>
假如我们把自己写的中间件填写到, $middleware的数组中,就会变成全局中间件,中间件会依次按顺序检测到最后一个,全部完成才会通过。这个全局中间件是不需要声明在路由中的,一定会执行的。
[ 中间件组 ]
<?php
...
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
...
?>
我们可以看到其中有一个数组是$middlewareGroups,而 web 路由组会自动加载给 routes/web.php。
当我们需要使用的时候,和正常调用中间件没有区别,简化了代码而已。
[ 中间件原理探讨 ]
前往以下网址查看就可以了,写的很通俗