Laravel 中间件
中间件作为用户和请求之间的一层。这意味着当用户请求服务器时,请求会经过中间件,然后中间件验证请求是否已经认证。如果用户请求已经认证,请求会被发送到后端。如果用户请求未经认证,那么中间件会将用户重定向到登录界面。
另外一个中间件可以用于执行各种任务,除了认证之外。例如,CORS中间件负责在所有的响应中添加头部。
Laravel 框架包含多个中间件,例如身份验证和CSRF保护,它们都位于 app/Http/Middleware 目录下。
我们可以说中间件是一个 HTTP 请求过滤器,您可以在其中进行条件检查。
在中间件中,我们将讨论以下主题:
- 创建一个中间件
- 应用中间件
- 在中间件中检查条件
- 路由中间件
创建一个中间件
输入以下命令 php artisan make:middleware ‘中间件名称’ 。

要查看是否已创建 CheckAge 中间件,请转到您的项目。我们的项目名称是 laravelproject,因此中间件的路径将为: C:\xampp\htdocs\laravelproject\app\Http\Middleware 。

应用中间件
中间件可以应用于所有URL或某些特定URL。
让我们把中间件应用于所有URL。
步骤1: 打开kernel.php文件。如果我们想要应用中间件于所有URL,那么将中间件的路径添加到中间件数组中。
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
    /**
     *  The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your  application.
     *
     * @var array
     */
 protected middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http \Middleware\ValidatePostSize::class,
 \App\Http\Middleware\TrimStrings::class,
 \App\Http\Middleware\CheckAge
::class,
  \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];
   /**
     * The application's route middleware groups.
     *
     * @var array
     */
protectedmiddlewareGroups = [
        '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',
        ],
    ];
 /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     *  
@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,
    ];
}
步骤2: 在 Git Bash 窗口中输入命令 php artisan serve 。

步骤3: 打开您已经创建为中间件的 CheckAge.php 文件。
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http 
\Request  request
     * @param  \Closurenext
     * @return mixed
     */
  public function handle(request, Closurenext)
 {
 //return "middleware";
echo "hello world";
return next(request);
}
}
步骤4: 现在,输入网址 ‘ http://localhost/laravelproject/public/ ‘。

让我们将中间件应用于一些特定的路由。
步骤1: 打开kernel.php文件。如果我们想要将中间件应用于一些特定的路由
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
    /**
     *  The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your  application.
     *
     * @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,
    ];
 /**
     * The application's route middleware groups.
     *
     * @var array
     */
 protectedmiddlewareGroups = [
 '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',
        ],
    ];
 /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     *  
@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,
'age' =>  \App\Http\Middleware\CheckAge::class ];
}
在上面的代码中,我们添加了代码,即: ‘age’ => \App\Http\Middleware\CheckAge::class’ ,其中age是中间件的名称。现在,我们可以在一些特定的路由中使用’age’中间件。
步骤2: 打开你创建的中间件文件 CheckAge.php 。
步骤3: 在 web.php 文件中添加中间件代码。
Route::Get('/',function()
{
  return view('welcome');
})-> middleware('age');
Route::Get('user/profile',function()
{
  return "user profile";
});
在以上代码中,我们在’/’根URL中添加了中间件,而在’user/profile’ URL中没有添加中间件。
输出:
当我们访问根URL时,输出将为:

上述输出显示中间件代码也已被访问,因为它显示了一个”hello world”。
当我们访问URL,即/user/profile时,输出将是:

以上输出表明中间件代码未被访问。
当参数通过URL传递时。
web.php
Route::Get('/{age}',function($age)
{
  return view('welcome');
})-> middleware('age');
检查年龄.php
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
 /**
 * Handle an incoming request.
 *
* @param
  \Illuminate\Http\Request  request
 * @param  \Closurenext
 * @return mixed
 */
  public function handle(request, Closurenext)
 {
 //return "middleware";
echo "this is checkage middleware";
return next(request);
}}
输出

在中间件中检查条件
中间件也可以用来检查条件。让我们通过一个例子来理解。
Route::Get('/{age}',function($age)
{
  return view('welcome');
})-> middleware('age');
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
     * Handle an incoming request.
     *
* @param
  \Illuminate\Http\Request  request
 * @param  \Closurenext
     * @return mixed
     */
   public function handle(request, Closurenext)
{
  //return "middleware";
if(request->age>10)
{
echo "Age is greater than 10";
}
else
{
echo"Age is not greater than 10";
}
returnnext($request);
}}
输出:

 极客笔记
极客笔记