加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

深入解析Laravel的中间件

发布时间:2020-12-13 20:59:50 所属栏目:PHP教程 来源:网络整理
导读:Laravel 中间件是什么? 简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。 我们可以通过中间件实现以下功能: 指定某些路由 设置 HTTP 响应头 记录请求 过滤请求的参数 决定是否启用站点维护模式 响应前后做一

Laravel 中间件是什么?

简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。

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

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

自定义中间件

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

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

执行上面的命令,Laravel 会在app/Http/Middleware目录下自动创建一个只包含handle方法的中间件。

<?php
namespace AppHttpMiddleware;
use Closure;
class RedirectIfSuperAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request,Closure $next)
    {
        return $next($request);
    }
}

在中间件被调用的时候,handle方法就会执行。这里需要注意的是 handle 方法默认有两个参数$request$next$request用来接受应用的请求组求,$next将请求传递给应用程序。这两个参数是handle必不可少的!中间件也包括前置中间件和后置中间件。

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

前置中间件:

<?你的逻辑就在这里
        );
    }
}

后置中间件:

<?)
    {
        $response = );
        你的逻辑就在这里 例如 重定向到  `/`

        $response;
    }
}

中间件的类别

  • 全局中间件
  • 路由中间件

全局中间件针对命中应用程序的每个请求运行。 Laravel 自带了大多数这些中间件例如ValidatePostSize,?TrimStrings,CheckForMaintenanceMode等等.

路由中间件仅在它们所连接的路由上运行
例如redirectIfAuthenticated.

注册中间件

创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。 要注册中间件,只需打开名为kernel.php的文件,该文件位于 Http 文件夹中,如下所示:

在这里插入图片描述


此文件包含默认 Laravel 提供的所有已注册中间件的列表。 它包含三个主要的中间件组$middleware,?$middlewareGroups和?$routeMiddleware

<?php
namespace AppHttp;
use IlluminateFoundationHttpKernel as HttpKernel;
class Kernel extends HttpKernel
{
    *
     * 应用程序的全局HTTP中间件。
     *
     * 这些中间件在应用程序的每个请求期间运行。
     *
     * @var array
     protected $middleware = [
        IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
        IlluminateFoundationHttpMiddlewareValidatePostSize::
        AppHttpMiddlewareTrimStrings::
        IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::
        AppHttpMiddlewareTrustProxies::
    ];
    *
     * 应用程序的路由中间件组.
     *
     * @var array
     $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::
            IlluminateSessionMiddlewareStartSession:: IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::
            AppHttpMiddlewareVerifyCsrfToken::
            IlluminateRoutingMiddlewareSubstituteBindings::
        ],'api' => [
            'throttle:60,1','bindings',1)">*
     * 应用程序的路由中间件.
     *
     * 可以将这些中间件分配给组或单独使用。
     *
     * @var array
     $routeMiddleware = [
        'auth' => IlluminateAuthMiddlewareAuthenticate::the just created middlware
        'superadmin' => AppHttpMiddlewareRedirectIfSuperAdmin:: 
    ];
}

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

分配中间件

有两个主要方法可以把注册好的中间件应用到路由中。

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

通过构造方法分配中间件

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

<?php
 IlluminateHttpRequest;

class ForumController  Controller
{

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

     viewForum(){

      return view('index'function edit($id){

    }

    function delete(){

    }

}

使用exceptonly方法我们可以选择把中间件应用到指定方法。如下所示:

<?*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']);
    }

     viewForums(){

       viewForumDetails(){

    }
}

通过路由分配中间件

如果注册的中间件可以直接附加到路由,如下所示:

<?方法 1
Route::get('admin/profile',1)"> () {
  action
})->middleware('auth');

*方法 2
或者像这样使用完全限定的类名:
*/
 AppHttpMiddlewareCheckAge;

Route::get('admin/profile',1)"> () {
     action
})->middleware(CheckAge::方法 3
Route::group(['middleware' => ['web']],1)">action
});

N:B 中间件组可以像单个中间件一样分配给路由

中间件参数

其他参数可以传递给中间件。 典型示例是将每个用户 ID 分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。 参数可以传递给中间件,如下所示:

<?方法1 (Through route)
Route::get('admin/profile',1)">action
})->middleware('auth:<role>'); <role> 这里应该被用户想要传递的任何参数替换。

//方法2 (Through a controller)
 __construct(){
        $this->middleware('auth:<role>');
    }
  }

通过用逗号分隔每个参数,可以将多个参数传递给中间件。

<?php
Route::get('admin/profile',1)">action
})->middleware('auth:<role>,<age>,<country>'); <role>,<country> 这里应该被用户想要传递的任何参数替换。

这些参数在$next变量之后传递给中间件的 handle 函数

<?$next,$role,1)">$age,1)">$country)
    {   
        使用解析参数的中间件逻辑
        );
    }
}

摘要

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

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

结论

Laravel 中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。 查看官方 Laravel 文档?这里?了解中间件的更多功能,最重要的是练习。


更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

还有更多进阶学习资料可以免费领取进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读