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 相关文章推荐
PHP中上传大体积文件时需要的设置
Oct 09 PHP
PHP个人网站架设连环讲(四)
Oct 09 PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
PHP小技巧之函数重载
Jun 02 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
YII框架中使用memcache的方法详解
Aug 02 PHP
PDO::setAttribute讲解
Jan 29 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中的生成XML文件的4种方法分享
2012/10/06 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
python中hashlib模块用法示例
2017/10/30 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python+logging+yaml实现日志分割
2019/07/22 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
幼儿园秋游活动方案
2014/01/21 职场文书
工作疏忽检讨书
2014/01/25 职场文书
2014年新生军训方案
2014/05/01 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
争先创优公开承诺书
2014/08/30 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
2014年环保局工作总结
2014/12/11 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
签约仪式致辞
2015/07/30 职场文书