继续上一篇的问题,如何动态的添加不同的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的执行顺序,摘抄一下:
When 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的。

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

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

    上一篇中分析了get()如何加入新的route的,这篇来分析route是如何被调用的. 首先,route是在routers里保存,router有在container中存放.container提供了ge ...

  2. 学习Slim Framework for PHP v3 (四)--get()是怎么加进去的?

    看看官网加粗的一句话: At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate ...

  3. 学习Slim Framework for PHP v3 ( 二)

    昨天说到能够成功将本地的URL通过在index.php 中添加get(pattern,clouser)路由到指定的处理类中,处理后(这里指存入数据库中),然后返回response在浏览器中显示. 昨天 ...

  4. 学习Slim Framework for PHP v3 (七)--route middleware怎么被add进来的?

    上两篇中分析了route是怎么被加进来的,以及如何被匹配的.这篇说一下route middleware是如何被加进来的,即add进来的.index.php的代码如下: $app->get('/f ...

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

    先标记觉得以后会用到的内容: // add route to the request's attributes in case a middleware or handler needs access ...

  6. 学习Entity Framework 中的Code First

    这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到 ...

  7. 转载:学习Entity Framework 中的Code First

    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写 ...

  8. 学习Coding-iOS开源项目日志(三)

    继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...

  9. Migration from Zend Framework v2 to v3

    Migration from Zend Framework v2 to v3 Zend Framework v2 to v3 has been intended as an incremental u ...

随机推荐

  1. Netty4.x分析(转)

    官网定义: netty是一个异步.事件驱动的网络应用框架,用于快速开发可维护的.高性能的服务端和客户端程序. 原理分析 Architecture Overview 网络模型:netty采用了React ...

  2. CGAffineTransformMakeTranslation和CGAffineTransform

    摘要: CGAffineTransformMakeTranslation和CGAffineTransformTranslate的区别 1.CGAffineTransformMakeTranslatio ...

  3. iOS开发——动画OC篇&知识点总结

    图层与动画知识点总结 1.Core Animation 非娱乐类的软件都会用到的动画,操作简单. 2.Quartz 2D绘图 是一个2D绘图引擎. (1) 绘图Context是一个绘图的目标对象,定义 ...

  4. GIT分支管理是一门艺术

    英文原文:http://www.nvie.com/posts/a-successful-git-branching-model/ 原文作者:Vincent Driessen 本文经Linux大棚博主总 ...

  5. mysqldump 安全 --skip-add-drop-table

    [root@localhost data]# mysqldump -uroot --master-data=2  -p  --single-transaction --skip-add-drop-ta ...

  6. 配置apache虚拟主机的实例总结

    如何实现apache虚拟主机配置. 1.基于ip地址的虚拟主机Listen 80<VirtualHost 172.20.30.40> DocumentRoot /home/httpd/ht ...

  7. QT核心编程之调试技术 (g)

    Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考D ...

  8. Ubuntu下VSFTPD(六)(常见FTP命令及其功能) (

    常见FTP命令及其功能  FTP 命令 功能  FTP 命令 功能  ls 显示服务器上的目录 ls [remote-dir][local-file] 显示远程目录remote-dir,并存入本地文件 ...

  9. php调试工具总结

    一:XDebug+Webgrind 二:XHProf

  10. 如何使用nodejs发邮件

    昨天就开始想使用nodemailer来实现一个发送邮件的功能,不过发现了很多个坑,网上给的资料也很杂很乱,所以决定写一篇真正能用的来帮助大家减少弯路 首先,我们先来看下代码,如上所示. 步骤: 1.下 ...