Laravel 控制器中间件

Laravel 控制器中间件

我们也可以在路由文件中为控制器的路由分配中间件。

有多种将中间件分配给控制器的方法:

在web.php文件中将中间件分配给控制器。

我们可以在 web.php 文件中为控制器分配中间件。以下是分配中间件所需的步骤:

步骤1: 首先,我们创建一个控制器。我们已经在前一主题中创建了一个名为 PostController 的控制器。

步骤2: 现在,我们创建中间件,我们想要分配给 PostController 。我们使用以下命令来创建中间件:

php artisan make:middleware Check

上面的命令创建了名为Check的中间件。

Laravel 控制器中间件

步骤3: 打开 Check.php 文件,该文件位于 laravelproject/app/http/Middleware 目录中。

<?php
namespace App\Http\Middleware;
use Closure;
class Check
{
    /**
     * Handle an incoming request.
     * @param  \Illuminate\Http\Request  request
@param  \Closurenext
     * @return mixed
     */
    public function handle(request, Closurenext)
   {
        echo "Middleware in Laravel <br><br>";  
        return next(request);
    }
}

步骤4: 现在,我们需要在 kernel.php 文件中添加中间件 Check.php 的路径。

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,
           'check'=>\App\Http\Middleware\Check::class
];

在上述代码中,突出显示的语句添加了中间件的路径,即 Check

步骤5:web.php 文件中添加以下代码,将中间件分配给 PostController

Route::get('posts', 'PostController@create')->middleware('check');

上述代码将中间件check分配给PostController。

步骤6: 在浏览器中输入URL http://localhost/laravelproject/public/posts,然后输出结果会是:

Laravel 控制器中间件

使用Controller构造函数

我们也可以使用Controller构造函数来分配中间件。它更方便,因为它将中间件限制在控制器类的特定方法上。

使用Controller构造函数分配中间件需要以下步骤:

  • 按照前一个案例的步骤1到步骤4执行。
  • web.php 文件中添加以下代码:
Route::get('posts', 'PostController@create');
  • 打开 PostController.php 文件。如果我们想要将中间件分配给PostController的 show() 方法,则需要在PostController.php文件中添加以下代码。
public function __construct()
    {
        $this->middleware('check')->only('show');
   }  

上面的代码仅将中间件指派给show()方法。

在PostController中添加上述代码后,postController的结构将如下所示:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     * @return \Illuminate\Http\Response
     */

this->middleware(function (request, next) {
    // ...
//  echo "Middleware in Laravel";
    returnnext(request);
});

public function index(){
  //
    }
/**
     * Show the form for creating a new resource.
     * @return \Illuminate\Http\Response
     */

public function create(){
    return "this is a create method";
}

/**
     * Store a newly created resource in storage.

     * @param  \Illuminate\Http\Requestrequest
     * @return \Illuminate\Http\Response
     */

public function store(Request request)
 {
        //
 }

 /**
     * Display the specified resource.
     * @param  intid
     * @return \Illuminate\HttpResponse
     */

public function show(id)
  {
        return "id is :".id;
   }
/**
     * Show the form for editing the specified resource.
     *
     * @param  int  id
     * @return  
\Illuminate\Http\Response
     */

public function edit(id)

{

//

}


/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request   
request
     * @param  intid
     * @return \Illuminate\Http\Response
     */

public function update(Request request,id)

{

//

}


/**
     * Remove the specified resource from storage.
     * @param  int  id
     * @return  \Illuminate\Http\Response
     */
   public function destroy(id)
  {

//
    }}

输出

如果我们访问URL http://localhost/laravelproject/public/posts,那么输出将是:

Laravel 控制器中间件

上面的输出显示,当我们访ask create()方法时,中间件 Check.php 文件(中间件)将不会被执行。

如果我们改变web.php文件的代码,代码如下:

Route::get('posts/{id}', 'PostController@show');

输出

Laravel 控制器中间件

在上述情况中,我们正在访问 PostController.php 文件中的show()方法,因此它也会执行 Check.php 文件(中间件)。

中间件闭包

控制器还允许您使用中间件闭包来注册路由。它允许应用程序为单个控制器定义中间件,而无需单独定义中间件类。

中间件闭包的语法

$this->middleware(function ($request, $next) {
    // ...
  return $next($request);
});

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程