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
Nov 08 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
怎样有效的进行自我评价
2013/10/06 职场文书
环境工程专业个人求职信
2013/12/05 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android