diff --git a/blog/laravel/index.md b/blog/laravel/index.md index 39c77d162c0deaf35a7c9aac4c3955ded8ca3b04..860bd3e1f191636e851b0c6a04a1aaf4b6920ede 100644 --- a/blog/laravel/index.md +++ b/blog/laravel/index.md @@ -60,5 +60,7 @@ dev: [Session](/blog/laravel/session.md) +[中间件 Middleware](/blog/laravel/middleware.md) + https://www.bilibili.com/video/BV1gE411j78F?p=38&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file diff --git a/blog/laravel/middleware.md b/blog/laravel/middleware.md new file mode 100644 index 0000000000000000000000000000000000000000..5a6a17f11d62209cf9a0fc803025a18a2298860d --- /dev/null +++ b/blog/laravel/middleware.md @@ -0,0 +1,134 @@ +# 中间件 Middleware + +## 路由中间件 + +中间件:当程序接收HTTP请求时,拦截后进行过滤和处理 + +创建一个check中间件 + +```bash +php artisan make:middleware Check +``` + +实现一个简单的登录身份验证的效果 + +首先创建一个Login控制器 + +```php +class LoginController +{ + public function index() + { + echo '管理员,您好!'; + } + + public function login() + { + echo '登录失败!'; + } +} +``` + +```php +Route::get('/admin','LoginController@index'); +Route::get('/login','LoginController@login'); +``` + +要求,当Http接受`id=1` 的情况下,它就是管理员,跳转index否则login + +```php +//固定方法,固定格式 +public function handle($request, Closure $next) { + //这里编写验证跳转方法 + if ($request->get('id') != 1) { + return redirect(url('/login')); + } + + // 固定返回格式,让其继续往下执行 + return $next($request); +} +``` + +注册中间件 + +```php +// Http/Kernel.php +protected $routeMiddleware = [ + 'check'=>\App\Http\Middleware\Check::class, +] +``` + +执行中间件 +```php +// 这种中间件,属于前置中间件 +Route::get('/admin','LoginController@index') + ->middleware('check'); +``` + +- 前置中间件:先拦截 Http 请求,再执行主体代码 +- 后置中间件:先执行主体代码,再拦截处理; + +```php +// 固定方法,固定格式 +public function handle($request, Closure $next) { + //先执行主体代码 + $response = $next($request); + //再进行拦截 Http 请求处理 echo '我是后置中间件'; + //固定格式返回 + return $response; +} +``` + +## 中间件进阶 + +设置多个中间件 + +```php +->middleware('check', 'auth'); +``` + +没有在配置中注册中间件,采用完整的类名来进行调用 +```php +->middleware(\App\Http\Middleware\Check::class); +``` + +全局中间件,每次执行都必然调用 +```php +protected $middleware = [ + \App\Http\Middleware\Every::class, +] +``` + +中间件的核心方法可以有第三个参数,可以在控制器调用时传递 + +```php +public function handle($request, Closure $next, $param); + +->middleware('check:abc'); +``` + +中间件组,如果有一些需要固定调用多个中间件,我们可以将它群组 +```php +protected $middlewareGroups = [ + 'mymd' => [ + 'check'=>\App\Http\Middleware\Check::class, + ] +]; +``` + +中间件的terminate()方法,可以在中间件响应完之后(return$next)再调用 +```php +public function terminate($request, $response) +{ + echo '
Http响应完毕之后再调用我'; +} +``` + +中间件也可以在控制器的构造方法里调用,这里注意错误跳转会死循环; + +```php +public function __construct() +{ + $this->middleware('check:abc'); +} +``` \ No newline at end of file