Code前端首页关于Code前端联系我们

什么是 Laravel 中间件?如何管理实施?

terry 2年前 (2023-09-25) 阅读数 49 #后端开发

Laravel 中间件是什么?

简单来说,laravel 中中间件的作用就是过滤 HTTP 请求,并根据不同的请求执行不同的逻辑操作。

通过中间件我们可以实现以下功能:

  • 确定具体路由
  • 设置HTTP响应头
  • 记录请求
  • 过滤请求以确定维护模式。 在响应之前和之后执行一些必要的操作

自定义中间件

在命令行运行以下简单命令,可以轻松创建一个新的中间件

php artisan make:middleware <MiddlewareName>
//MiddlewareName 就是你要创建的中间件的名字
复制代码

运行上面的命令,Laravel 将在❀中间件仅包含方法handle会在Http/Middleware目录中自动创建。

<?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向应用程序发送请求。这两个参数对于处理很重要!中间件又包括前中间件和后中间件。

“预中间件”顾名思义,在将请求转发到应用程序之前处理一些逻辑。另一方面,一旦中间件在应用程序处理请求并生成响应后运行。

前置中间件:

<?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 附带了大多数中间件,例如ValidatePostSizeTrimStringsCheckForMaintenance

仅在连接到通过打开
创建的任何中间件的路由上重定向中间件片段例如 redirectIfAuthenticated。

♶只需要注册为 Laravel 知道存在的中间件即可。要注册中间件,请打开位于 Http 文件夹中名为 kernel.php 的文件,如下所示: Laravel 中间件是什么?如何自定义实现?

此文件包含默认 Laravel 列表提供的所有已注册中间件。它包含三个主要中间件组$middleware$middlewaregroups$utemiddlewarewarewarewware♶中间件♶middleware♶s每个HTTP请求的应用程序,因此,如果要运行对于每个请求的中间件,您必须在这里注册。 $middlewareGroups 可以按组注册中间件,从而可以更轻松地使用组名称将多个中间件附加到路由。 $routeMiddleware 包含每个列出的路由中间件的数组。

中间件分发

将注册的中间件应用到路由有两种主要方法。

  • 通过控制器构造函数
  • 通过路由

通过构造函数分配中间件

通过构造函数分配中间件有很大的灵活性,提供了两个重要的方法 meter($parameter

only( $parameter),这两个方法可以允许或阻止中间件应用于控制器中的辅助方法。如果不使用这两个方法,中间件将与每个控制器方法一起使用。

<?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){

    }

}
复制代码

使用 除了和之外

,我们可以选择将中间件应用到特定的方法上,如下:

<?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

<?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);
    }
}
复制代码

摘要

要使用中间件创建中间件,请按照以下流程操作: middleware Creator :middleware 中间件名称.

  • 列出应用程序中kernel.php→Http文件夹中的中间件
  • 在生成的中间件中编写逻辑
  • 将中间件分配给路由或控制器
  • 结论Laravel中间件可以轻松实现保护我们的路线、过滤输入并做许多其他事情,而无需编写逻辑。请查看此处的 Laravel 官方文档,了解有关中间件可以做什么以及最重要的是实践的更多信息。

    作者:阿布阿布

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门