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新手入门学习方法
May 08 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
php截取中文字符串函数实例
Feb 23 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
smarty模板数学运算示例
Dec 11 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 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下intval()和(int)转换使用与区别
2008/07/18 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
详解Python Socket网络编程
2016/01/05 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python实现随机漫步算法
2018/08/27 Python
Python3标准库总结
2019/02/19 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
西式婚礼证婚词
2014/01/12 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
我的画教学反思
2014/04/28 职场文书
家长会欢迎标语
2014/06/24 职场文书
班组拓展活动方案
2014/08/14 职场文书
最美护士演讲稿
2014/08/27 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
筑梦中国心得体会
2016/01/18 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
Python语言中的数据类型-序列
2022/02/24 Python