📜  Laravel控制器中间件

📅  最后修改于: 2021-01-05 10:40:24             🧑  作者: Mango

控制器中间件

我们还可以在路由文件中将中间件分配给控制器的路由。

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

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

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

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

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

php artisan make:middleware Check

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

步骤3:打开在laravelproject / app / http / Middleware目录中创建的Check.php文件。


"; 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');

上面的代码分配了中间件,即检查到PostController。

步骤6:在网络浏览器中输入URL http:// localhost / laravelproject / public / posts,那么输出将是:

使用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的结构将如下所示:

middleware(function ($request, $next) {
    // ...
//  echo "Middleware in Laravel";
    return $next($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\Request   
$request
     * @return \Illuminate\Http\Response
     */
    
public function store(Request $request)
 {
        //
 }

 /**
     * Display the specified resource.
     * @param  int  $id
     * @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  int  $id
     * @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,则输出为:

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

如果我们更改web.php文件的代码,则代码为:

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

输出量

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

中间件关闭

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

中间件关闭的语法

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