大白话 Laravel 中间件

栏目: 编程语言 · PHP · 发布时间: 5年前

内容简介:文章转自:简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。

大白话  <a href='https://www.codercto.com/topics/5169.html'>Laravel</a>  中间件

文章转自: 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 自带了大多数这些中间件例如 ValidatePostSizeTrimStrings , CheckForMaintenanceMode 等等.

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

例如   redirectIfAuthenticated .

注册中间件

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

大白话 Laravel 中间件

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);
    }
}

总结

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

php artisan make:middleware 中间件名

Conclusion

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

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

更多文章: https://learnku.com/laravel/c...


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Mathematica Cookbook

Mathematica Cookbook

Sal Mangano / O'Reilly Media / 2009 / GBP 51.99

As the leading software application for symbolic mathematics, Mathematica is standard in many environments that rely on math, such as science, engineering, financial analysis, software development, an......一起来看看 《Mathematica Cookbook》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具