drupal是建立在Symfony组件之上,Symfony认为网站系统无非就是一个将请求转化为响应的系统,并以此设计执行流程,drupal也是如此,所以整个系统运行之初就是建立请求对象,这个对象将贯穿整个程序,被各个模块访问。
建立请求对象也是为适应面向对象开发方式,这个对象将把以前面向过程式程序设计经常使用的系统输入、环境变量、cookies、session等等数据封装起来,后续程序仅仅面对该对象即可,非常简洁,如无必要,不应该直接去操作$_POST、$_GET、$_COOKIE等等全局内容。为了方便使用请求对象也加入了一些额外的功能,比如可以添加自定义属性,这样模块间可以很方便的共享一些数据,它就像一艘船,顺流而下,可以带上你给的数据被沿途的处理节点看到。
一个根据外部输入产生的请求对象,系统根据它产生响应对象,响应可能包含很多块内容,为了产生每一块内容,在内部可以建立很多子请求对象,相对的由外部输入产生的请求对象称为主请求对象,主请求和子请求被放入请求堆栈中管理。
drupal不经修改的完全使用了Symfony的请求组件,请求对象的类定义位于:\vendor\symfony\http-foundation\Request.php
下面来看看这个请求对象:
产生主请求:
$request = Request::createFromGlobals();
这将把$_GET, $_POST, $_COOKIE, $_FILES, $_SERVER数据全部封装到请求对象$request中,Request类允许自定义一个工厂去产生Request对象,工厂产生的对象必须是Request的实例。工厂是一个回调,先需要设置到Request中,如下:
Request::setFactory($callable); $request = Request::createFromGlobals();这允许你对基本的请求对象进行扩展,对产生的请求对象添加一些额外数据等等。
在工厂里可以实例化一个继承了Request类的类,极大的增加了灵活性。
在Reques中还提供了静态方法:Reques::create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)用以根据自定义的uri产生一个子请求。
Reques提供了操作session的能力,注入一个实现了Symfony\Component\HttpFoundation\Session\SessionInterface接口的session对象即可:
<pre name="code" class="php">$request->setSession(SessionInterface $session);
对$_GET, $_POST, $_COOKIE内容的访问全部通过参数包对象进行访问
\vendor\symfony\http-foundation\ParameterBag.php
上传的文件通过FileBag对象访问,服务器环境数据通过ServerBag对象访问,获得的http头数据通过HeaderBag对象访问
一系列的get方法可以得到常用的一些数据
请求堆栈:
在系统运行中通过请求堆栈对象访问请求对象,请求堆栈对象定义了一个关于请求对象的堆栈数据结构(先进后出),在内部它是通过php数组实现,保存了各个请求对象,最底层是主请求。
请求堆栈对象很简单,请看类定义\vendor\symfony\http-foundation\RequestStack.php
我是云客,【云游天下,做客四方】,联系方式见主页,欢迎转载,但须注明出处
time:20160914