带中间件的api调用链|php与nodejs的异同

php几年前已经采用nodejs管理应用依赖包的方法(npm/borwser),产生了composer;如今,api接口开放时代,php的微型框架slim为api而生,它集成psr/全名空间/中间件的方式,这种由python django(https://docs.djangoproject.com/en/1.6/topics/http/middleware/)流行而来的处理方式已经被其它框架所接受,好比nodejs的koa。php

如今slim已经进行到3.0,每一个版本的更新都很激进,几乎面目全非。html

slim3中关于中间件的说明是这样的:node

http://www.slimframework.com/docs/concepts/middleware.htmlpython

middleware

能够看出,请求经过入口,经层层的中间处理,好比过滤、认证、加载数据库、加载缓存。。。最后到达app核心层,而后response又经原路返回,最后输出。es6

每一个middleware都是一个匿名函数,函数处理完毕,最后返回一个对下一中间件的调用;若是没有调用,那么中断对其他中间的处理,直接到达核心的app,输出结果。数据库

<?php
class ExampleMiddleware
{
    /**
     * Example middleware invokable class
     *
     * @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
     * @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
     * @param  callable                                 $next     Next middleware
     *
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function __invoke($request, $response, $next)
    {
        $response->getBody()->write('BEFORE');
        $response = $next($request, $response);
        $response->getBody()->write('AFTER'); npm

        return $response;
    }
}django

 

nodejs中,koa框架也是这个原理:api

http://koa.rednode.cn/#introduction缓存

onion (1)

不一样的是,nodejs经过es6的generator关键字yield来传递到下一中间件的:

var koa = require('koa');
var app = koa();

// x-response-time

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  this.set('X-Response-Time', ms + 'ms');
});

// logger

app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log('%s %s - %s', this.method, this.url, ms);
});

// response

app.use(function *(){
  this.body = 'Hello World';
});

app.listen(3000);
.middleware1 {
  // (1) do some stuff
  .middleware2 {
    // (2) do some other stuff
    .middleware3 {
      // (3) NO next yield !
      // this.body = 'hello world'
    }
    // (4) do some other stuff later
  }
  // (5) do some stuff lastest and return
}

-- end --

相关文章
相关标签/搜索