Laravel5.1框架注册中间件的三种场景详解


Posted in PHP onJuly 09, 2019

本文实例讲述了Laravel5.1框架注册中间件的三种场景。分享给大家供大家参考,具体如下:

在Laravel中注册中间件主要有三种场景,一种给控制器中的方法进行注册,一种是给整个控制器进行注册,最后一种是给全局注册中间件。

  • 1、在控制器中的方法中注册中间件

这种需求是最为常见,这个例子是给IndexController中的index方法添加中间件。

Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);
  • 2、在整个控制器中注册中间件

这种需求有的时候也会出现,如果给整个控制器中注册中间件,那么这个控制器中的所有方法都注册了该中间件。跟我一起来找到答案!

控制器基类(Controller.php)

首先来看一下控制器基类,可以看到Controller类继承了BaseController类,而BaseController的路径是Illuminate\Routing\Controller,然后我们来看看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类

从源码中我们可以看到有一个属性为middleware,这个middleware属性就是我们要找的,所以只要在需要注册的控制器下使用这个属性即可完成注册。

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.");
  }

给整个控制器注册中间件

我们选用系统的Authenticate中间件来举例,这个中间件是用于检测用户是否登录。

注意:中间件的名称为键,值可以是一个空数组

protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];
  • 3、全局注册中间件

打开app/Http/Kernel.php,这是一个内核文件,可以看到一个属性$middleware,我们只需要将我们自定义的中间件的路径添加到这个$middleware 这个属性中即可。

此外还有一个$routeMiddleware属性,使用这个属性可以根据路由来注册中间件。
我们的路由有:goods/infogoods/detail两个路由器
我们可以将$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,
  ];
}

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
7个超级实用的PHP代码片段
Jul 11 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
php二分查找二种实现示例
Mar 12 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
PHP导入导出Excel代码
Jul 07 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 #PHP
PHP 7.4中使用预加载的方法详解
Jul 08 #PHP
php apache开启跨域模式过程详解
Jul 08 #PHP
php如何把表单内容提交到数据库
Jul 08 #PHP
php利用array_search与array_column实现二维数组查找
Jul 08 #PHP
php实现获取近几日、月时间示例
Jul 06 #PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 #PHP
You might like
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
js+canvas实现画板功能
2020/09/13 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
小班重阳节活动方案
2014/02/08 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
学术会议通知范文
2015/04/15 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers