PHP laravel系列之中间件

1、什么是中间件?

经过以前对路由和控制器的学习,咱们知道一个请求能够经过路由分配到某个控制器上而后进行处理,若是咱们想对请求加一个限制,只容许某些请求可以到达控制器,而过滤掉咱们不想要的请求,这时候就可使用 Laravel 的中间件。
例如,Laravel 自带的 Auth 中间件能够用来验证用户的身份,若是用户未经过身份验证,中间件将会把用户导向登陆页面,反之,当用户经过了身份验证,中间件将会经过此请求并接着往下执行。
固然了,除了验证,中间件也能够完成其余的各类各样的任务,如:CORS 中间件负责替全部即将离开程序的响应加入适当的标头;而日志中间件则能够记录全部传入应用程序的请求。
Laravel 框架已经内置了一些中间件,包括维护、身份验证、CSRF 保护,等等。全部的中间件都放在 app/Http/Middleware 目录内。
除了 Laravel 内置的中间件之外,咱们也能够根据本身的须要建立中间件。php

2、建立中间件

下面咱们经过一个简单的例子来体会一下 midddleware 的工做过程。
思路以下:
1. 建立一个带参路由,用来产生一个请求,而且附带一个 age 参数;
2. 建立一个简单的中间件,用来过滤掉 age > 25 的用户,来实现一个简单的中间件过滤;
3. 未经过中间件的请求将被重定向到主页;
4. 经过中间件的的请求将达到指定的控制器,实现相应动做。
首先建立带参路由:java

app/Http/routes.php
<?php
Route::get('/', function () {
    return view('welcome');
});
Route::get('/young/{age}','UserController@young');

根据咱们的思路:
• age > 25的路由如 网址/young/56 应该被过滤
• age <= 25的路由如 网址/young/18 应该被经过
而后建立中间件,咱们使用 artisan 来建立:web

cd ~/Code/myweb
php artisan make:middleware YoungMiddleware

此命令将会在 app/Http/Middleware 目录内建立一个名称为 YoungMiddleware 的中间件。
在这个中间件内咱们只容许请求的年龄 age 变量小于 25 时才能访问路由,不然,咱们会将用户重定向到首页。
打开这个中间件:
app/Http/Middleware/YoungMiddleware.php浏览器

<?php namespace App\Http\Middleware; use Closure; class YoungMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request); } }

默认生成的中间件代码是没作任何过滤的,也就是说任何请求都会经过。
下面咱们加入咱们的过滤代码:bash

<?php

namespace App\Http\Middleware;

use Closure;

class YoungMiddleware {
    /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */
    public function handle($request, Closure $next) {
        // 若是传入的参数 age 大于25,重定向到'/'
        if ($request->age > 25) {
            return redirect('/');
        }
        return $next($request);
    }
}

至此,中间件建立完成。markdown

3、注册并添加中间件

中间件建立好后,还须要注册并添加到相应的路由上,才能工做。
注册中间件:app

打开 app/Http/Kernel.php
app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /** * The application's global HTTP middleware stack. * * @var array */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ];

    /** * The application's route middleware. * * @var array */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

    ];
}

若是你但愿每一个 HTTP 请求都通过一个中间件,只要将该中间件的类加入到 app/Http/Kernel.php 的 middlewareapp/Http/Kernel.php routeMiddleware 属性清单列表中,并给这个中间件起一个名字。
由于咱们这里只须要对咱们本节实验开始建立的路由添加这个中间件,因此咱们修改代码以下:
app/Http/Kernel.php框架

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /** * The application's global HTTP middleware stack. * * @var array */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,

        //若是须要全局中间件在这里注册
    ];

    /** * The application's route middleware. * * @var array */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        //在这里添加了一行
        'young' => \App\Http\Middleware\YoungMiddleware::class,
    ];
}

注册完成后,咱们回到routes.php文件中为路由添加中间件。
打开 app/Http/routes.php 修改代码:
app/Http/routes.php学习

<?php
Route::get('/young/{age}', 'UserController@young')->middleware('young');

这里注意后面添加部分!!!
至此,一个简单的中间件就完成了!
此时,根据咱们以前的思路:
• age > 25 的路由如 网址/young/56 应该会被重定向到 ‘/’
• age <= 25 的路由如 网址/young/18 应该会经过中间件,到达控制器UserController@young
最后,完成控制器部分的代码。
使用 artisan 命令建立一个控制器:测试

php artisan make:controller UserController  --plain

添加 –plain 后缀能够不生成默认的空方法。
打开app/Http/Controllers/UserController.php,添加young()方法:
app/Http/Controllers/UserController.php

<?php class UserController extends Controller { public function young(){ return 'I`m young!'; } }

至此,全部的代码都完成了,打开浏览器测试一下效果。
访问 localhost/young/18 成功显示,以下图:
这里写图片描述
访问 localhost/young/56 重定向到了 ‘/’ 以下图:
有没有感受这张画面很美好呢!!!

画面至关美好了!!!

4、小结


我的总结:
中间件用于过滤 首先在原来的控制器、路由是不用修改的,增长过滤只要指向中间件就行了,这里框架里为了增长可读性而增长了kernel,能够注册,也就是给原来中间件的位置起一个别名
形式以下:Route::get(‘/young/{age}’, ‘Mycontroller@young’)->middleware(‘young’);
中间件的书写方式:
一、建立中间件 app/Http/Middleware下建立中间件文件
二、注册并添加中间件 app/Http/Kernel.php文件中注册中间件
三、修改routes app/Http/routes.php

参考:实验楼

相关文章
相关标签/搜索