“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
从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中国社区需要大家共建共享,云客持开放态度与大家合作推进。
允许任何机构以及个人转载、翻译、引用传播等,但须同步附带本声明。
反馈互动