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 无限级数据JSON格式及JS解析
Jul 17 PHP
PHP 图片上传代码
Sep 13 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
对PHP PDO的一些认识小结
Jan 23 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP会话控制实例分析
Dec 24 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHP关联链接常用代码
2012/11/05 PHP
浅析is_writable的php实现
2013/06/18 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
PHP实现微信对账单处理
2018/10/01 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
js获取和设置属性的方法
2014/02/20 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
django2 快速安装指南分享
2018/01/05 Python
python2.7到3.x迁移指南
2018/02/01 Python
python调用摄像头显示图像的实例
2018/08/03 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python右对齐的实例方法
2020/07/05 Python
机关作风整顿个人剖析材料
2014/10/06 职场文书
民事诉讼代理词
2015/05/25 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
员工手册董事长致辞
2015/07/29 职场文书
4种非常实用的python内置数据结构
2021/04/28 Python
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
Node.js实现断点续传
2021/06/23 Javascript
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python