在上一节中,我们提到了如何创建一个Bunlde 并且在默认控制器中添加一些方法。如果有参照之前的说法进行的话,读者很有可能会被提示说 返回的Response对象不能为空。好啦,我们就来研究一下,怎么从请求中读取数据,并且使用Controller 提供的 Response来给请求一个适当的返回值。

在Symfony的运行流程是这样的:

client请求 =>

AppKernel 执行xxx =>

生成一个Response 对象放在container里面(不要问container是什么,暂时把他当做一个巨大的数组,里面什么都有就行了) =>

调用路由 =>

发现你的Controller method 并且执行 =>

根据你的Controller的返回值(必须是一个Response对象) ,执行实际的返回

注:实际的过程非常复杂,这里只是为了大致理解Request对象,和Reponse对象。

1. Request对象:

不论你是通过表单提交,或者 url 数据, 或者post数据,或者怎么怎么样来的数据,都会被保存在Request对象里面,并且你能在Controller里面通过访问Request对象来获取本次访问的一系列信息。 例如:

由上图可知,很多以前在$_GET $_POST $_REQUEST $_SERVER数组里面的变量已经被全部安排在了Request对象里面。我们也会发现$_GET $POST 这些数组已经成了空的。

好了,我们来看一看这个Reponse的结构

  • $parameters   路由参数,符合Symfony2规范

  • $request         好像是post数据

  • $query            get数据

  • $server            server数据

  • $files               files 数据

  • $cookies         ...

  • $headers        ....

  • $content        ...

....

这些变量的类型都是Symfony\Component\HttpFoundation\ParameterBag,如果你有兴趣看一看这个类的话,你会发现这其实就是一个封装得比较好的参数集合(可以认为是数组)。我最最经常使用的方法不过是:e.g xxx->parameters->get("_controller") 这样的写法。而这正是Symfony2做得非常出色的一点,高度统一的接口,几乎所有的数据对象都通过这样简单的方式来访问。

  • 注释:可能你会问为什么非要这样做,难道用$_GET 这些超级全局变量来访问不是更简单更easy么? 其实仁者见仁,智者见智。没有时间和你讨论到底哪样做更优雅。不过oop的用法确实比丑陋的$_超级变量看起来让PHP显得没有那么粗陋。在一定程度上避免了对于全局变量的使用(其实这是非常重要的),并且通过在一定通过secure的设置,来避免了很大一部分的验证(为你提供了相对安全的访问),并且对于$_GET $_POST 路由的处理过程中是存在非常多的事件的,为你提供了一个access。这样的废话说多了其实没什么用,如果你有二次开发过国内某些知名应用,或许你能够明白一点点我心中的悲愤~

然后我们来看一看我们如何能够在Controller里面访问到他。 我所知道的一共有两种方式:

    • 在Action 的参数里添加对于Request的需要:

    • 使用Container Service 来获取( 暂时不用理解container是什么,你只用记住,在全局有一个非常大的的对象,存放着很多你需要的工具。

如上述,你可以通过使用访问Request变量更好地理解你client的请求,并且做出更多的事情,比如form 提交,比如file upload,  识别一些特别的参数等等等。

2. Reponse 对象。

注释:或许你会感到非常不适应,为什么会有这样的对象,为什么非要返回这样一个对象?为什么我写echo "heheh" return null; 反而不行呢,凭什么我返回null 也可以很好的实现,但是它还是会抛出一个异常?Symfony2是不是要求得太严格了?是不是过于傻逼了?好吧,有这些疑问非常正常,作为一个phper 对于类型意识的薄弱相当的正常。对于这个问题我这样理解:如果你使用过java servlet来写服务端的话,那么你会发现symfony2这样的模式好像跟它非常的相似,送给你一个Request对象,要求你返回一个Response对象。为什么非要返回呢?你可以使用java来实现一下这个过程,你会发现,如果这里直接输出,整个程序戛然而止,但是我们还有很多事情没有做。如果说我们想对于每一个输出做一个回调,那么我们应该怎么写?难道是通过在每一个controller后面加一个变量?还是使用ob类函数来抓取输出,然后在输出之前做一些事情。不论采取哪种方式来实现,都并不优雅,并不符合程序的逻辑。返回一个$Reponse对象 更有利于类型的检查,以及一系列后面的操作。其实是php 一个好的开始。记住一句话就是:永远不要使用echo print 类函数(甚至说在php6中 更少的使用独立的函数尽量少地使用,例如现在已经存在了\DateTime对象了,那么就尽量少使用date类函数。她们只会使得你的程序变得复杂不堪而不是更易扩展,oop的思想需要更多的在php中更好的利用!叫我j2ee的phper。

如上图,Symfon\Component\HttpFoundation\Response,空的Reponse包含如下内容,这些不过是我们header 和 content的内容而已。其实非常简单。重要的是,在很多内置的Symfony2组建,他们都会给你返回一个$Reponse对象,并且通过对于header和content的控制,你可以很好地返回各种东西~

3. session

获取session 和cookie 的方式和获取Request的方式相同,通过service container来获取。对于session 和 cookie的操作不过于存取。非常简单。

session api  见详情

e.g:

  • 不过值得一提的是Symfony2提供了一个特别的session 用法,就是一次性变量。

    Flash Message。

  • 还有一点就是Attribute的处理可以有非常特别的办法。

关于以上两点,因为用到比较少,第一种多用于暂存变量,第二种只是节约时间的写法而已。具体的用法见  详情

4. cookie

平时我们使用$_COOKIE对象的时候,就把他当做一个超级全局变量来使用,意味着,我往这个数组中存一些东西,然后下次请求来的时候我还可以取出来。但是我们可以审视一下Cookie本身的实现。

server 告诉 client 需要保存一个变量=>   header set-cookie (%^$#^)//cookie 的编码

client 保存在本地,并且下次向服务器发送请求的时候自带一个header里面放有cookie信息。

Symfony2中严格遵守了这样一个流程,我们来看一看cookie分别的存取是怎么样的:

还记得,不论在Request还是在Response对象里面都存在cookie这个字段。这里就体现出了他的价值所在。

cookie 的保存大概也就这么多了。

最新文章

  1. ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction
  2. easy ui插件
  3. 模拟微信上传图片(带预览,支持预览gif)
  4. HTML快速入门4
  5. Ubuntu配置java环境变量
  6. UIImage转换UIColor内存会莫名增大可以试试另一种方法
  7. page cache 与 page buffer 转
  8. DELL R710服务器可以安装的VMWare ESX Server 4.1 全套下载带注册码
  9. hibernate_validator_01
  10. java提高篇(十二)-----equals()
  11. javascript6
  12. DOM4J案例详解(添加 ,查询 ,删除 ,保存)
  13. 暑假学习计划:Day_1.JSP&Servlet&Tocat 环境搭建到基础的认识。
  14. [Swift]LeetCode395. 至少有K个重复字符的最长子串 | Longest Substring with At Least K Repeating Characters
  15. 【腾讯Bugly干货分享】WebSocket 浅析
  16. Create AI Guard Class
  17. 两张图概括struts2执行流程核心(经典)
  18. mysql误删数据快速恢复
  19. Brief History of Machine Learning
  20. Python绘图工具matplotlib的使用(图形并茂)

热门文章

  1. 使用百度地图SDK出现的问题及解决方法
  2. LNMP架构下的nginx、mysql、php的源码安装
  3. 【linux】linux无root权限安装包的一般流程
  4. java创建类的5种方式
  5. SendMessage wMsg常量值参考
  6. c++ int 转 string 实现前缀补0
  7. geek网工作室主页------我的第一个小项目
  8. (译)KVO的内部实现
  9. Mac下忘记mysql的root密码
  10. linux之 LVM扩容