1 Laravel 中间件是什么
从官方网站第一次看到这个的时候,让我想起了WebLogic,可是Laravel的中间件跟WebLogic半毛钱关系也没有,也没有任何相似之处。不知道外国人咋起的名字。
官方的解释如下:
HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。
2 创建一个简单的中间件
在目录app/Http/Middleware中新建文件“MyMiddleware.php”,代码如下:
<?php
namespace App\Http\Middleware;
use Closure;
class MyMiddleware {
/**
* Run the request filter.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->route('age') < 18)
{
return redirect('error');
}
return $next($request);
}
}
打开文件 app/Http/Kernel.php,在数组$routeMiddleware添加新的元素:'my' => \App\Http\Middleware\MyMiddleware::class,如下图示:
修改 app/Http/routes.php,修改后的代码如下:
打开浏览器访问:http://localhost:801/user/20,如下图:<?php /* |-------------------------------------------------------------------------- | Application Routes |-------------------------------------------------------------------------- | | Here is where you can register all of the routes for an application. | It's a breeze. Simply tell Laravel the URIs it should respond to | and give it the controller to call when that URI is requested. | */ Route::get('/', function () { return view('welcome'); }); Route::get('/error', function () { return '未满18周岁禁止访问'; }); Route::get('/user/{age}', ['middleware' => 'my', function ($age) { return '用户年龄:'.$age; }]);
再访问:http://localhost:801/user/2,会跳转到 http://localhost:801/error,如下图示:
3 前置与后置中间件
上例所示的是一个前置中间件,修改上例中handle方法如下则变成了后置中间件:
public function handle($request, Closure $next)
{
if ($request->route('age') < 18)
{
return redirect('error');
}
$response = $next($request);
return $response;
}
你只需关注return返回结果的方式即可分辨前置或者后置。
4 中间件的注册
中间件是在 app/Http/Kernel.php 中注册的:
A.数组 $middleware 是全局注册;
B.数组 $routeMiddleware 则是自定了键值对,在路由中引用时使用键名为"middleware",如上例所示。
除此之外,还有可终止中间件,后期再做研究。