[教程] 大白话 Laravel 中间件

26次阅读

共计 5784 个字符,预计需要花费 15 分钟才能阅读完成。

文章转自:https://learnku.com/laravel/t…

Laravel 中间件是什么?
简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。
我们可以通过中间件实现以下功能:

指定某些路由
设置 HTTP 响应头
记录请求
过滤请求的参数
决定是否启用站点维护模式
响应前后做一些必要的操作

自定义中间件
命令行执行下面的简单命令,就可以轻松创建一个新的中间件
php artisan make:middleware <MiddlewareName>
//MiddlewareName 就是你要创建的中间件的名字

执行上面的命令,Laravel 会在 app/Http/Middleware 目录下自动创建一个只包含 handle 方法的中间件。
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}

在中间件被调用的时候,handle 方法就会执行。这里需要注意的是 handle 方法默认有两个参数  $request 和 $next。$request 用来接受应用的请求组求,$next 将请求传递给应用程序。这两个参数是 handle 必不可少的!中间件也包括前置中间件和后置中间件。
“前置中间件”顾名思义在将请求转发到应用程序之前处理一些逻辑。另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。
前置中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 你的逻辑就在这里
return $next($request);
}
}

后置中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
// 你的逻辑就在这里 例如 重定向到 `/`

return $response;
}
}

中间件的类别

全局中间件
路由中间件

全局中间件针对命中应用程序的每个请求运行。Laravel 自带了大多数这些中间件例如 ValidatePostSize, TrimStrings,CheckForMaintenanceMode 等等.
路由中间件仅在它们所连接的路由上运行例如  redirectIfAuthenticated.
注册中间件
创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。要注册中间件,只需打开名为 kernel.php 的文件,该文件位于 Http 文件夹中,如下所示:

This file contains list of all registered middlewares that come with Laravel by default. it contains three major arrays which 此文件包含默认 Laravel 提供的所有已注册中间件的列表。它包含三个主要的中间件组 $middleware , $middlewareGroups 和 $routeMiddleware
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* 应用程序的全局 HTTP 中间件。
*
* 这些中间件在应用程序的每个请求期间运行。
*
* @var array
*/
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,
];
/**
* 应用程序的路由中间件组.
*
* @var array
*/
protected $middlewareGroups = [
‘web’ => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
‘api’ => [
‘throttle:60,1’,
‘bindings’,
],
];
/**
* 应用程序的路由中间件.
*
* 可以将这些中间件分配给组或单独使用。
*
* @var array
*/
protected $routeMiddleware = [
‘auth’ => \Illuminate\Auth\Middleware\Authenticate::class,
‘auth.basic’ => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
‘bindings’ => \Illuminate\Routing\Middleware\SubstituteBindings::class,
‘can’ => \Illuminate\Auth\Middleware\Authorize::class,
‘guest’ => \App\Http\Middleware\RedirectIfAuthenticated::class,
‘throttle’ => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//the just created middlware
‘superadmin’ => \App\Http\Middleware\RedirectIfSuperAdmin::class,
];
}

 $middleware 数组包含全局中间件,它运行应用程序的每个 HTTP 请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。$middlewareGroups 使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。$routeMiddleware 数组包含各个注册的路由中间件。
分配中间件
有两个主要方法可以把注册好的中间件应用到路由中。

通过控制器的构造方法
通过路由

通过构造方法分配中间件
通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法 except($parameters) 和 only($parameters),这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。
<?php
use Illuminate\Http\Request;

class ForumController extends Controller
{

public function __construct(){
/**in this case the middleware named auth is applied
to every single function within this controller
*/
$this->middleware(‘auth’);
}

public function viewForum(){

return view(‘index’);
}

public function edit($id){

}

public function delete($id){

}

}

使用 except 和 only 方法我们可以选择把中间件应用到指定方法。
<?php
use Illuminate\Http\Request;

class ForumController extends Controller
{

public function __construct(){
/**the authentication middleware here applies to all functions but
viewForums() and viewForumDetails() and the opposite of this happens
when you use only()
*/
$this->middleware(‘auth’)->except([‘viewForums’, ‘viewForumDetails’]);
}

public function viewForums(){

return view(‘index’);
}

public function edit($id){

}

public function delete($id){

}

public function viewForumDetails(){

}
}

通过路由分配中间件
如果注册的中间件可以直接附加到路由,如下所示:
<?php
// 方法 1
Route::get(‘admin/profile’, function () {
//action
})->middleware(‘auth’);

/** 方法 2
或者像这样使用完全限定的类名:
*/
use App\Http\Middleware\CheckAge;

Route::get(‘admin/profile’, function () {
// action
})->middleware(CheckAge::class);

// 方法 3
Route::group([‘middleware’ => [‘web’]], function () {
//action
});

N:B 中间件组可以像单个中间件一样分配给路由
中间件参数
其他参数可以传递给中间件。典型示例是将每个用户 ID 分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。参数可以传递给中间件,如下所示:
<?php
// 方法 1 (Through route)
Route::get(‘admin/profile’, function () {
//action
})->middleware(‘auth:<role>’); //<role> 这里应该被用户想要传递的任何参数替换。

// 方法 2 (Through a controller)
use Illuminate\Http\Request;

class ForumController extends Controller
{

public function __construct(){
$this->middleware(‘auth:<role>’);
}
}

通过用逗号分隔每个参数,可以将多个参数传递给中间件。
<?php
Route::get(‘admin/profile’, function () {
//action
})->middleware(‘auth:<role>,<age>,<country>’); //<role>, <age>, <country> 这里应该被用户想要传递的任何参数替换。

这些参数在 $next 变量之后传递给中间件的 handle 函数
<?php
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $role, $age, $country)
{
// 使用解析参数的中间件逻辑
return $next($request);
}
}

总结
要创建中间件,请执行以下过程

使用 artisan 命令创建中间件 php artisan make:middleware 中间件名.
在 app→Http 文件夹中的 kernel.php 中注册中间件
在创建的中间件中编写逻辑
将中间件分配给路由或控制器

Conclusion
Laravel 中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。查看官方 Laravel 文档 这里 了解中间件的更多功能,最重要的是练习。
文章转自:https://learnku.com/laravel/t… 更多文章:https://learnku.com/laravel/c…

正文完
 0