首页 > 代码库 > Laravel中间件

Laravel中间件

先谈一谈中间件的使用场景,比如路由转到一张页面,我们需要记录用户的cookie,或者检测用户的访问权限,这些操作如果全写在控制器里是不合适的,因为随着业务的扩充,控制器里的业务逻辑会越来越臃肿,难以维护,所以,不同的操作,我们分别写在各自的中间件里。我们使用artisan命令行来创建一个中间件。

1 php artisan make:middleware MyMiddleware

中间件的php文件都放在了目录\app\Http\Middleware下,大家应该注意到,中间件Middleware和控制器Controller文件夹都在Http文件夹下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
namespace App\Http\Middleware;
use Closure;
class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

这里我们只改动handle函数来举例中间件的使用

1
2
3
4
5
public function handle($request, Closure $next)
{
        echo ‘MyMiddleware is running!‘;
        return $next($request);
}

中间件不注册是不能使用的。注册方式有以下两种,取其一即可。

第一种,Kernel.php的$middleware数组中注册,这种注册后,所有的HTTP请求都将可以启动这个中间件,特别适合用在身份认证类的功能上。

1
2
3
4
protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \App\Http\Middleware\MyMiddleware::class,
];

第二种,Kernel.php的$routeMiddleware数组中注册,这种注册方式适用于部分指定页面才可以启动这个中间件。

1
2
3
4
5
6
7
8
protected $routeMiddleware = [
        ‘auth‘ => \App\Http\Middleware\Authenticate::class,
        ‘auth.basic‘ => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        ‘guest‘ => \App\Http\Middleware\RedirectIfAuthenticated::class,
        ‘throttle‘ => \Illuminate\Routing\Middleware\ThrottleRequests::class,
         
    ‘mymiddleware‘=>\App\Http\Middleware\MyMiddleware::class,
];

请注意,注册中间件,不是等于启动中间件,注册仅仅是让你能用而已,但是具体调用还是要另外写的。

 

如果你的View有对应的Controller,就直接在Controller里写。

1
2
3
4
5
6
7
8
9
10
class MyController extends Controller
{
    public function index()
    {
        $this->middleware(‘MyMiddleware‘);
                //你也可以继续使用其他中间件
         
        return View(‘welcome‘);
    }
}

如果路由里直接绑定了一个匿名函数,可以修改routes.php

1
2
3
Route::get(‘/index‘,[‘middleware‘=>‘mymiddleware‘,function(){
    return ‘hello world‘;
}]);

  

  

  

Laravel中间件