本文實(shí)例講述了Laravel5.1框架注冊(cè)中間件的三種場(chǎng)景。分享給大家供大家參考,具體如下:
在Laravel中注冊(cè)中間件主要有三種場(chǎng)景,一種給控制器中的方法進(jìn)行注冊(cè),一種是給整個(gè)控制器進(jìn)行注冊(cè),最后一種是給全局注冊(cè)中間件。
這種需求是最為常見(jiàn),這個(gè)例子是給IndexController中的index方法添加中間件。
Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);
這種需求有的時(shí)候也會(huì)出現(xiàn),如果給整個(gè)控制器中注冊(cè)中間件,那么這個(gè)控制器中的所有方法都注冊(cè)了該中間件。跟我一起來(lái)找到答案!
控制器基類(lèi)(Controller.php)
首先來(lái)看一下控制器基類(lèi),可以看到Controller類(lèi)繼承了BaseController類(lèi),而B(niǎo)aseController的路徑是Illuminate\Routing\Controller,然后我們來(lái)看看Laravel的源碼。
?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;
}
BaseController類(lèi)
從源碼中我們可以看到有一個(gè)屬性為middleware,這個(gè)middleware屬性就是我們要找的,所以只要在需要注冊(cè)的控制器下使用這個(gè)屬性即可完成注冊(cè)。
protected $middleware = [];
?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.");
}
給整個(gè)控制器注冊(cè)中間件
我們選用系統(tǒng)的Authenticate中間件來(lái)舉例,這個(gè)中間件是用于檢測(cè)用戶(hù)是否登錄。
注意:中間件的名稱(chēng)為鍵,值可以是一個(gè)空數(shù)組
protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];
打開(kāi)app/Http/Kernel.php,這是一個(gè)內(nèi)核文件,可以看到一個(gè)屬性$middleware,我們只需要將我們自定義的中間件的路徑添加到這個(gè)$middleware 這個(gè)屬性中即可。
此外還有一個(gè)$routeMiddleware屬性,使用這個(gè)屬性可以根據(jù)路由來(lái)注冊(cè)中間件。
我們的路由有:goods/info,goods/detail兩個(gè)路由器
我們可以將$routeMiddleware屬性添加一行
'goods.*' => \App\Http\Middleware\GoodsMiddleware::class,
?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,
];
}
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Laravel框架入門(mén)與進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- laravel利用中間件做防非法登錄和權(quán)限控制示例
- laravel在中間件內(nèi)生成參數(shù)并且傳遞到控制器中的2種姿勢(shì)
- 淺談Laravel中的三種中間件的作用
- Laravel獲取當(dāng)前請(qǐng)求的控制器和方法以及中間件的例子
- Laravel框架控制器的middleware中間件用法分析
- laravel利用中間件防止未登錄用戶(hù)直接訪問(wèn)后臺(tái)的方法
- Laravel 6 將新增為指定隊(duì)列任務(wù)設(shè)置中間件的功能
- laravel框架中間件 except 和 only 的用法示例
- 淺談laravel中間件的創(chuàng)建思路