中间件

漫谈php框架之中间件

市面上常见的php框架有很多,最近因为有技术需求,所以对常见的php框架的中间件进行了一些了解。各个框架尽管在目标上对php框架的定义大同小异,但是在实现方式上却各有不同,且看下文:

定义

首先什么是php的中间件?

根据zend-framework中的定义:

所谓中间件是指提供在请求和响应之间的,能够截获请求,并在其基础上进行逻辑处理,与此同时能够完成请求的响应或传递到下一个中间件的代码。

这一介绍十分的简洁,但却略显抽象,接下来我们通过例子来一个个看。

处在原始时代的CI

首先来看CI框架,php star数 12830.
作为一款非常简洁的框架,CI被吐槽的不少,但是也有很多人喜欢。首先来看它官方给出的一张请求时序图:

CI框架请求时序

CI框架请求时序

根据上文中对中间件的定义,那么对于CI框架来说,唯一称得上是内置中间件的:Security模块

Security模块是在请求进入controller之前实现的逻辑:

  • 请求在完成路由之后,进入controller之前;
  • CI框架支持通过配置的方式,决定是否启用包括“URI安全、XSS过滤、CSRF保护”在内的功能模块;
  • 一旦框架初始化时探测到模块启用,那么优先进行模块逻辑;
  • 触发安全模块,请求即告终止。

乍看起来,CI框架的中间件十分的局限,但是其实它却提供了无限的可能性。。因为CI中还提供了一个叫做Hooks的功能。即钩子。

下面来看两个个hooks的例子:

定义一个在controller逻辑之前的钩子,并指定钩子的参数、类名或函数名信息:

$hook['pre_controller'] = array(
    'class'    => 'MyClass',
    'function' => 'Myfunction',
    'filename' => 'Myclass.php',
    'filepath'