在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,
];

}

相关文章
相关标签/搜索