Laravel5.1框架注册中间件的三种场景详解
时间:2022-07-27
本文章向大家介绍Laravel5.1框架注册中间件的三种场景详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了Laravel5.1框架注册中间件的三种场景。分享给大家供大家参考,具体如下:
在Laravel中注册中间件主要有三种场景,一种给控制器中的方法进行注册,一种是给整个控制器进行注册,最后一种是给全局注册中间件。
- 1、在控制器中的方法中注册中间件
这种需求是最为常见,这个例子是给IndexController中的index方法添加中间件。
Route::get('/', ['middleware'= ['AppHttpMiddlewareEmailMiddleware'],'uses'= 'IndexController@index']);
- 2、在整个控制器中注册中间件
这种需求有的时候也会出现,如果给整个控制器中注册中间件,那么这个控制器中的所有方法都注册了该中间件。跟我一起来找到答案!
控制器基类(Controller.php)
首先来看一下控制器基类,可以看到Controller类继承了BaseController类,而BaseController的路径是IlluminateRoutingController,然后我们来看看Laravel的源码。
<?php
namespace AppHttpControllers;
use IlluminateFoundationBusDispatchesJobs;
use IlluminateRoutingController as BaseController;
use IlluminateFoundationValidationValidatesRequests;
use IlluminateFoundationAuthAccessAuthorizesRequests;
abstract class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
BaseController类
从源码中我们可以看到有一个属性为middleware,这个middleware属性就是我们要找的,所以只要在需要注册的控制器下使用这个属性即可完成注册。
protected $middleware = [];
<?php
namespace IlluminateRouting;
use BadMethodCallException;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
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 IlluminateRoutingControllerMiddlewareOptions
*/
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 SymfonyComponentHttpFoundationResponse
*/
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 SymfonyComponentHttpKernelExceptionNotFoundHttpException
*/
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.");
}
给整个控制器注册中间件
我们选用系统的Authenticate中间件来举例,这个中间件是用于检测用户是否登录。
注意:中间件的名称为键,值可以是一个空数组
protected $middleware = ['AppHttpMiddlewareAuthenticate'= []];
- 3、全局注册中间件
打开app/Http/Kernel.php,这是一个内核文件,可以看到一个属性middleware,我们只需要将我们自定义的中间件的路径添加到这个middleware 这个属性中即可。
此外还有一个$routeMiddleware属性,使用这个属性可以根据路由来注册中间件。 我们的路由有:goods/info,goods/detail两个路由器 我们可以将$routeMiddleware属性添加一行
'goods.*' = AppHttpMiddlewareGoodsMiddleware::class,
<?php
namespace AppHttp;
use IlluminateFoundationHttpKernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* @var array
*/
protected $middleware = [
IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
];
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' = AppHttpMiddlewareAuthenticate::class,
'auth.basic' = IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'guest' = AppHttpMiddlewareRedirectIfAuthenticated::class,
];
}
- bootstrap源码分析之Carousel
- BOOtstrap源码分析之 tooltip、popover
- 两个链表的第一个公共结点
- mac下Android开发环境搭建
- 三位数的排列组合
- Undefined symbols for architecture i386:"_OBJC_CLASS_$_xx", referenced from: 解决方法
- Xcode5.0使用iOS6.1SDK及模拟器
- 内存泄露
- 深入理解及应用Position
- 数字营销人的年终奖该如何翻倍?这里有5个秘籍
- 处理日期时间NSDate
- 云安全(第1部分):从何开始
- ios 开发,通讯录信息调用常用方法,这个比较全,不用再整理了
- 深入理解和应用Float属性
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 试图解释清楚【JavaScript Event Loop】
- 结合Event Loop谈谈对Vue中nextTick的理解
- Vue3响应式原理
- ClickHouse和他的朋友们(1)编译、开发、测试
- 学会如何学习 - 成为更好的终身学习者
- ToolBar中menu无法同时显示图标和文字问题的解决方法
- Android官方的侧滑控件DrawerLayout的示例代码
- 详解React Native监听Android回退按键与程序化退出应用
- 详解android webView独立进程通讯方式
- Android编程中File文件常见存储与读取操作demo示例
- Android读取properties配置文件的实例详解
- Android开发实现popupWindow弹出窗口自定义布局与位置控制方法
- Android编程实现使用handler在子线程中更新UI示例
- Android编程实现图片放大缩小功能ZoomControls控件用法实例
- 详解Android MacAddress 适配心得