2. 请求对象Request及请求堆栈

从drupal 8开始,后续版本的Drupal是建立在Symfony组件之上,Symfony的认知是“网站系统就是一个将请求转化为响应的系统”(这是一个非常精辟的总结),并以此设计执行流程,drupal也是如此,所以整个系统运行之初就是建立请求对象,这个对象将贯穿整个系统,被各个模块访问。

建立请求对象也是为适应面向对象开发方式,这个对象将把以前面向过程式程序设计经常使用的系统输入、环境变量、cookies、session等等数据封装起来,后续程序仅仅面对该对象即可,非常简洁,如无必要,不应该直接去操作$_POST、$_GET、$_COOKIE等等全局内容。为了方便使用请求对象,其也加入了一些额外的功能,比如可以添加自定义属性,这样模块间可以很方便的共享一些数据,它就像一艘船,顺流而下,可以带上你给的数据被沿途的处理节点看到。

一个根据外部输入产生的请求对象,系统根据它产生响应对象,为了产生响应内容,有时需要在内部自己访问自己,或递归访问自己,这就需要可以建立子请求对象,相对的由外部输入产生的请求对象称为主请求对象,主请求和子请求被放入请求堆栈中管理,其实在系统中子请求功能用的极少,但有时确实需要;如果你认为“子请求”功能是为了让每一个子请求建立一块页面内容(即“块”概念),那么就错了,Drupal系统并非此架构,页面中每一个块是由区块系统产生的,而非子请求,学习完后便能体会。

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();  

这允许你对基本的请求对象进行扩展,对产生的请求对象添加一些额外数据等等,记住:Drupal极其灵活,可以让你替换几乎任意自带的类。

在工厂里可以实例化一个继承了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对象即可:

$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

作者声明:
伴随Drupal不断发布的新版本,本系列教程持续更新,适用于Drupal V8、V9、V10以及后续版本,如未及时更新请反馈。
本Drupal教程为中文原创,并非翻译,来自作者耗时八年对源代码的理解,最初取名为“云客Drupal源码分析”并在社区发布。
作者:云客,微信号及个人网站域名均为“indrupal”;首发于云客个人网站“水滴间”,已发布一百余万字,持续更新中。
鸣谢“未来很美科技”提供的赞助支持,“未来很美(深圳)科技有限公司”是国内专业的Drupal开发公司,总部位于深圳。
如对您有帮助可到“水滴间”进行赞助支持,同时Drupal中国社区需要大家共建共享,云客持开放态度与大家合作推进。
允许任何机构以及个人转载、翻译、引用传播等,但须同步附带本声明。

 

 

 

添加新评论

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
请输入以上问题的答案,换一个问题请刷新,不区分大小写