在上一节中,我们提到了如何创建一个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 的保存大概也就这么多了。

Symfony 2.0 认识Request, Response, Session, Cookie的更多相关文章

  1. JSP最常用的五种内置对象(out,request,response,session,application)

    为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,applicatio ...

  2. 在Struts2的Action中获得request response session几种方法

    转载自~ 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式.分别为se ...

  3. JSP 内置对象(request response session application out pageContext)

    request对象  javax.servlet.http.HttpServletRequest接口的实例 request.setCharacterEncoding("utf-8" ...

  4. request,response,session

    1.request.getParameter("key")接受的是来自客户登陆端的数据,接受的是post或get方式传送的value. 2.请求的默认字符集是ISO-8859-1, ...

  5. request response session的常用方法

    .request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例. 序号 方 法 说 明 1 object ...

  6. struts2的action中获得request response session 对象

    在struts2中有两种方式可以得到这些对象 1.非IoC方式 要获得上述对象,关键Struts 2中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态 ...

  7. JSP内置对象1(request,response,session)

    request对象 response对象:请求重定向与请求转发的区别. session对象:表示客户端与服务器的一次会话,也就是用户浏览网站所花费的时间.在服务器的内存中保存着不同用户的session ...

  8. SpringBoot项目中普通类获取http相关的类(request/response/session)

    import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...

  9. JSP内置对象--pageContent,request,response,session,application,config,out,page,exception

随机推荐

  1. Git观察和比较

    log git log 时间是从下到上,从远到近   whatchanged git whatchanged 时间是从下到上,从远到近   diff --staged 比较工作区和缓存区之间的差异 g ...

  2. JQuery中绑定事件(bind())和移除事件(unbind())

    有时候事件执行完了,想取消事件的效果可以通过一定的办法来处理.比如bind()(绑定事件)和unbind()(移除通过bind()方法添加的事件)方法来移除事件的效果. 比如下面的一个案例: 复制代码 ...

  3. Double H3.0

    Double H3.0 团队分工 组员 王熙航 杨艺勇 刘杰 郑沐榕 李冠锐 曾磊鑫 戴俊涵 聂寒冰 任务内容 分配任务,整理内容,审核修改 规格说明书汇总排版 ,记录其他组的提问 用例图,功能描述 ...

  4. 第一个openGL程序

    一.工具的安装 因为要写C++程序,为了便捷,这里我安装的Visual Studio: 免费使用90天!安装好了之后,我们要为我们的开发安装相应的工具集: 因为我是要在windows上跑的,所以选择如 ...

  5. Ext.js高级组件

    第二章:Ext.js高级组件 grid组件 普通方式 表格面板类Ext.grid.Panel xtype(别名):gridpanel.grid title标题.renderTo渲染至.width宽.h ...

  6. TCP/IP分析

    TCP/IP四层模型 TCP/IP参考模型 ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用.如图2-1所示,是TCP/I ...

  7. c# 爬虫(三) 文件上传

    在上一篇中,我们说了模拟登录, 下面我们说说附件上传. 据说,最早的http协议是不支持附件上传的,后来有添加了一个RFC 2045 协议,才支持附件上传,关于附件上传,请参见 http://www. ...

  8. linux中bin与sbin目录的作用及区别介绍

    linux中bin与sbin目录的作用及区别介绍 本文介绍下,linux中的二个主要目录:bin与sbin,它们的作用与区别,学习linux的朋友可以参考下 在linux系统中,有两个重要的目录:bi ...

  9. Javaweb经典三层架构的演变

    1.Javaweb经历了三个时期 ①JSP Model1第一代 JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低!Model1第一代时期,服务器端只有JSP页面,所有的 ...

  10. Erlang Web 监控工具

    转自http://www.cnblogs.com/me-sa/archive/2012/04/17/erlang-web-monitor.html  Erlang已经提供了一系列工具查看运行时状态查看 ...