学习Slim Framework for PHP v3 (三)

  继续上一篇的问题,如何动态的添加不同的Module。添加Module是给Middleware用的,用于调用Module的写日志方法。上篇中的写法是在app->add(mv),这时的middleware是全局的。其实可以给每个route添加middleware,这个思路是通过阅读官方文档获得的,所以说文档还是要读的。

  有了上面的思路之后,就可以给每个route添加middleware了。先上代码:

$app->post(‘/homepage‘, function ($request, $response, $args){
    Example\Module\Replace::instance()->init($request,$response);
    return $response;
})->add(Example\MiddleWare\MyMiddleware::instance(Example\Module\Replace::instance()));

  通过这样的代码就可以给各种post,get等通过add方法添加middleware。这样就基本解决了每个route绑定不同的Module,但是每个Module必须是单例模式的。

  一个技术上的问题在于:

Example\Module\Replace::instance()->init($request,$response);与
add(Example\MiddleWare\MyMiddleware::instance(Example\Module\Replace::instance()));中的Replace::instance()到底是哪个先执行的。因为Replace是单例,所以哪个先执行还是一个结果的。但是还是跟踪了一下。可以确定:add(Example\MiddleWare\MyMiddleware::instance(Example\Module\Replace::instance()))是先执行的,这个是PHP编译解释时先做的,因为route里是Closure只注册不执行的。根据官网给出的文档解释APP,route的执行顺序,摘抄一下:

hen you run the Slim application, the Request and Response objects traverse the middleware structure from the outside in. They first enter the outer-most middleware, then the next outer-most middleware, (and so on), until they ultimately arrive at the Slim application itself. After the Slim application dispatches the appropriate route, the resultant Response object exits the Slim application and traverses the middleware structure from the inside out. Ultimately, a final Response object exits the outer-most middleware, is serialized into a raw HTTP response, and is returned to the HTTP client.

图片地址:http://www.slimframework.com/docs/concepts/middleware.html 擦。。。不能粘贴图片吗?!!

其实这个说法是对于有APP Middleware时的执行顺序,如果是route Middleware 那么中间是route。还有所谓的从最外的Middleware开始向内进入APP,也不完全这样,毕竟是需要从App->run方法开始执行请求。总体的过程如下:

app->run()

|

\ /

app->__invoke()

|

\/

route->addMiddleware()

|

\/

myMiddleware->__invoke()

|

\/

myModel->instance()::->init()(在route Middleware 调用时才实例化MyModel)

|

\/

myMiddleware->__invoke() (这里指middleware next后的剩余部分)

以之前的角度看这个图是没有问题的,但是以现在的角度看这个图还是略粗和有点小问题。

 

这样的话每个route绑定module的问题就解决了,只是Moduel现在是单例了,不知道这样合理与否。或者有必要更深一步了解单例模式的使用场景。

下一篇开始写关于它的内核的理解,即到底是怎样将请求分给每个route的。

时间: 2024-10-17 05:05:54

学习Slim Framework for PHP v3 (三)的相关文章

学习Slim Framework for PHP v3 (四)

看看官网加粗的一句话: At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate callback routine, and returns an HTTP response. That’s it. 那么它是如何分发接收到的Request的呢,这几天就来研究这个事情. 先看看为了让请求进入到index.php 需要对Apache做什么.配置如下,其实也是通常配置而已: # Dir

学习Slim Framework for PHP v3 (一)

因为公司的项目用到是slim 框架,所以想把它学习一下.在公司用到是Slim2版本,现在官网已经到达 Slim3的版本了.官网地址:http://www.cnblogs.com/lmenglliren89php/. 首先按照官网的教程,安装Slim: 1.curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer 2.composer requi

学习Slim Framework for PHP v3 (四)--route怎么被调用的?

上一篇中分析了get()如何加入新的route的,这篇来分析route是如何被调用的. 首先,route是在routers里保存,router有在container中存放.container提供了get()方法获取里面的元素,性质类似于Set().这个性质见Slim\Container的get()和Pimple\Container的 offsetGet()方法. /**Slim/Container:**/ /** * Finds an entry of the container by its

学习Slim Framework for PHP v3 ( 二)

昨天说到能够成功将本地的URL通过在index.php 中添加get(pattern,clouser)路由到指定的处理类中,处理后(这里指存入数据库中),然后返回response在浏览器中显示. 昨天最后留的问题是:能不能在App的container中添加自己的key呢,今天还没有解决. 今天做的工作是:添加一个middleware,在处理完成后记录日志. Slim3.0不再像Slim2那样在每个Middleware都添加Application,所以在Middleware中获取App的数据有困难

学习Slim Framework for PHP v3 (六)--route怎么被匹配的?

先标记觉得以后会用到的内容: // add route to the request's attributes in case a middleware or handler needs access to the route $request = $request->withAttribute('route', $route); 或许以后可以在Middleware中拿到route做些其他的事情. 上篇已经分析到route是在APP的__invoke()中被调用的,这里来看看怎么匹配route的

学习 About iOS App Programming 第三天

-------State Preservation and Restoration 即使我们的app能支持后台运行,但它也不能一直在后台运行,有一些情况,系统也许会需要终止app,为了释放内存给在前台运行的app.但是用户不关心app是不是被关闭,用户只知道这个app应用就是这个地方暂停了,当再次起来时应该就在上一次退出的地方.这样用户能继续进行他上次没有完成的任务.因此UIKit实现了这种功能. UIKit的状态保存系统提供了一个简单同时比较精准的基础技术对于保存和恢复app viewcont

Sharepoint2013搜索学习笔记之修改搜索拓扑(三)

搜索服务新建好之后可以从管理中心,应用程序管理页面,进入搜索服务的管理页面,进入管理页面之后可以看到当前sharepoint场的搜索拓扑结构. 如果sharepoint场内有多台服务器,需要将搜索组件部署到这些服务器上,可以在装有sharepoint管理中心的服务器上启动sharepoint命令行管理程序,通过口令的方式对搜索拓扑进行更改. 注意: 向新的服务器添加搜索组件之前,必须先启动新增服务器上的搜索服务实例.搜索服务实例将启动搜索服务(OSearch15 和 SPSearchHostCo

Swift学习——Swift基础详解(三)

小葵花课堂继续开讲 Numeric Literals    数字文本 数字文本有以下几种写法: A decimal number, with no prefix A binary number, with a 0b prefix An octal number, with a 0o prefix A hexadecimal number, with a 0x prefix 十进制数,无前缀:二进制数,0b前缀:八进制数,0o前缀:十六进制数,0x前缀 论数字17的N种表现形式: let deci

GSON使用的学习笔记,进阶篇(三)

本篇笔记内容比较杂乱,没有专门去整理. TypeAdapter 现在轮到TypeAdapter类上场,但考虑到gson默认行为已足够强大,加上项目实践中应用json时场景不会太复杂,所以一般不需要自定义TypeAdapter.TypeAdapter优点是集成了JsonWriter和JsonReader两个类,定义了一套与gson框架交互的良好接口,同时便于管理编码和解码的实现代码,不至于太零碎.因而在了解JsonReader和JsonWriter的使用方法之后,自定义TypeAdapter类来完