在Laravel中註冊中間件

在Laravel中註冊中間件主要有三種場景,一種給控制器中的方法進行註冊,一種是給整個控制器進行註冊,最後一種是給全局註冊中間件。php

一、在控制器中的方法中註冊中間件
這種需求是最爲常見,這個例子是給IndexController中的index方法添加中間件。

Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);數組

二、在整個控制器中註冊中間件
這種需求有的時候也會出現,若是給整個控制器中註冊中間件,那麼這個控制器中的全部方法都註冊了該中間件。跟我一塊兒來找到答案!

控制器基類(Controller.PHP)app

首先來看一下控制器基類,能夠看到Controller類繼承了BaseController類,而BaseController的路徑是Illuminate\Routing\Controller,而後咱們來看看Laravel的源碼。this

<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
abstract class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}spa

BaseController類code

從源碼中咱們能夠看到有一個屬性爲middleware,這個middleware屬性就是咱們要找的,因此只要在須要註冊的控制器下使用這個屬性便可完成註冊。中間件

protected $middleware = [];繼承

1

1

<?php
namespace Illuminate\Routing;
use BadMethodCallException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
abstract class Controller
{
/**
* The middleware registered on the controller.

@var array
*/
protected $middleware = [];
/**
* Register middleware on the controller.

@param array|string|\Closure $middleware
* @param array $options
* @return \Illuminate\Routing\ControllerMiddlewareOptions
*/
public function middleware($middleware, array $options = [])
{
foreach ((array) $middleware as $m) {
$this->middleware[] = [
'middleware' => $m,
'options' => &$options,
];
}
return new ControllerMiddlewareOptions($options);
}
/**
* Get the middleware assigned to the controller.

@return array
*/
public function getMiddleware()
{
return $this->middleware;
}
/**
* Execute an action on the controller.

@param string $method
* @param array $parameters
* @return \Symfony\Component\HttpFoundation\Response
*/
public function callAction($method, $parameters)
{
return call_user_func_array([$this, $method], $parameters);
}
/**
* Handle calls to missing methods on the controller.

@param array $parameters
* @return mixed

@throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
*/
public function missingMethod($parameters = [])
{
throw new NotFoundHttpException('Controller method not found.');
}
/**
* Handle calls to missing methods on the controller.

@param string $method
* @param array $parameters
* @return mixed

@throws \BadMethodCallException
*/
public function __call($method, $parameters)
{
throw new BadMethodCallException("Method [{$method}] does not exist.");
}路由

給整個控制器註冊中間件get

咱們選用系統的Authenticate中間件來舉例,這個中間件是用於檢測用戶是否登陸。

注意:中間件的名稱爲鍵,值能夠是一個空數組

protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];

1

1

三、全局註冊中間件

打開app/Http/Kernel.php,這是一個內核文件,能夠看到一個屬性$middleware,咱們只須要將咱們自定義的中間件的路徑添加到這個$middleware 這個屬性中便可。

此外還有一個$routeMiddleware屬性,使用這個屬性能夠根據路由來註冊中間件。
咱們的路由有:goods/info,goods/detail兩個路由器
咱們能夠將$routeMiddleware屬性添加一行

'goods.*' => \App\Http\Middleware\GoodsMiddleware::class,

1

1

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.

@var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];

/**
 * The application's route middleware.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

}

相關文章
相關標籤/搜索