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 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
PHP5各个版本的新功能和新特性总结
Mar 16 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
Laravel5中contracts详解
Mar 02 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 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新手上路(二)
2006/10/09 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python实现的计数排序算法示例
2017/11/29 Python
pandas值替换方法
2018/07/10 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
最受欢迎的自我评价
2013/12/22 职场文书
求职意向书范文
2014/04/01 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
日元符号 ¥
2022/02/17 杂记
python双向链表实例详解
2022/05/25 Python