Laravel文档梳理8、中间件

前言:Laravel文档梳理,仅作为记录后看,无关其他。


1、什么是中间件?
见字识意,放在中间部分,用来处理某种业务的组件。http中间件,提供了一个方便的机制过滤进入应用程序的http请求,只有经过了中间件的过滤,程序才会继续往下运行。

2、常见的中间件功能
Auth中间件,验证用户的身份
Cors中间件,负责替所有即将离开程序的响应,加入适当的标头
日志中间件,负责记录所有传入应用程序的请求。

3、laravel框架的中间件放在哪里?
App/Http/Middleware

4、如何创建出一个中间件?
php artisan make:middleware OldMiddleware

Ps:可手动创建,也可以通过artisan命令来生成。
此命令将会在 app/Http/Middleware 目录内设定一个名称为 OldMiddleware 的类

5、OldMiddleware中间件实例
<?php

namespace App\Http\Middleware;

use Closure;

class OldMiddleware
{
    /**
     * 运行请求过滤器。
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->input('age') <= 200) {
            return redirect('home');
        }

        return $next($request);
    }

}
Age小于200,中间件将返回http请求重定位到用户端,否则,进步传入应用程序。

6、如果你希望http请求,都经过你的中间件,那该怎么处理?
将中间件加入到app/Http/kernel.php文件的$middleware属性中。

7、如果你想单独给某个路由指定中间件,如何处理?
a、在app/Http/Kernel.php文件的$routeMiddleware属性中加一组自定义的该中间件的键值,如下:
// 在 App\Http\Kernel 类内...

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

b、在路由文件中,针对路由使用添加好的中间件的键名,即可。
中间件,一旦在kernel文件中指定,就可以在路由选项中,使用middleware键值指定:
Route::get('admin/profile', ['middleware' => 'auth', function () {
    //
}]);

c、也可以给一个路由使用多个中间件,如下:
Route::get('/', ['middleware' => ['first', 'second'], function () {
    //
}]);

d、除了c这种方法,也可以链式调用middleware方法
Route::get('/', function () {
    //
}])->middleware(['first', 'second']);

8、中间件参数
运行某操作前,要验证当前用户是否有该【角色】,你可以创建一个角色中间件,接收角色名称,作为额外传参:
<?php

namespace App\Http\Middleware;

use Closure;

class RoleMiddleware
{
    /**
     * 运行请求过滤
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // 如果用户没有特定「角色」的话
        }

        return $next($request);
    }

}
在路由中,可使用冒号:来间隔中间件名称与指派参数,多个参数可以使用逗号分隔
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);

9、Terminable中间件
这个中间件,是为了满足http请求发送到浏览器之后,才处理session存储操作的。
<?php

namespace Illuminate\Session\Middleware;

use Closure;

class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // 保存 session 数据...
    }
}

一旦定义了中间件,你就需要把它加到kernel文件的全局中间件清单列表中。

当你调用terminate()方法时,laravel会从服务器容器解析出一个全新的中间件实例。

如果你希望handle() terminate()方法被调用时使用一致的中间件,那么,就需要使用容器的singleton方法注册中间件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值