64. 中间件

2017-10-07  本文已影响18人  独步天堂
<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * 处理传入的请求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }

}

若给定的 age 小于等于 200,那中间件将返回一个 HTTP 重定向到客户端;否则,请求将进一步传递到应用中。要让请求继续传递到应用程序中(即允许「通过」中间件验证的),只需使用 $request 作为参数去调用回调函数 $next 。


$request->age 将获取得地址中 /age/200 中的 200。


以下的中间件会在应用处理请求 之前 执行一些任务:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 执行动作

        return $next($request);
    }
}

下面(这种写法的)中间件会在应用处理请求 之后 执行其任务:

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 执行动作

        return $response;
    }
}

默认的全局中间件

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

检查程序是否处于维护模式

验证 post 数据大小,避免大于php设定的 post_max_size。如果超出php设定的post_max_size则会抛出Illuminate\Http\Exception\PostTooLargeException

去除首尾空白字符。自动修剪所有请求数据,这样你就不用担心你的表单字段中不经意的添加了额外的空格。

自动修剪所有请求数据,转换空字符串为 null。

该中间件允许你快速自定义需要被应用信任的负载均衡器或代理。被信任的代理位于这个中间件的 $proxies 属性列表,除了配置信任代理之外,还可以配置代理发送的带有请求来源信息的消息头。


一旦在 Kernel 中定义了中间件,就可使用 middleware 方法将中间件分配给路由:

Route::get('admin/profile', function () {
    //
})->middleware('auth');
Route::get('/age/{age}', function($age){
    return '这是age' . $age;
})->name('age')->middleware('checkage');

为路由分配多个中间件:

Route::get('/', function () {
    //
})->middleware('first', 'second');

添加中间件组后,可以使用与单个中间件相同的语法将中间件组分配给路由和控制器操作。

Route::get('/', function () {
    //
})->middleware('web');

Route::group(['middleware' => ['web']], function () {
    //
});

附加的中间件参数应该在 $next 参数之后被传递:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * 处理传入的请求
     *
     * @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}', function ($id) {
    //
})->middleware('role:editor');
<?php

namespace Illuminate\Session\Middleware;

use Closure;

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

    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

terminate 方法应该同时接收和响应。一旦定义了这个中间件,你应该将它添加到路由列表或 app/Http/Kernel.php 文件的全局中间件中。

上一篇下一篇

猜你喜欢

热点阅读