在阅读本主题前,你需要先阅读本系列的渲染数组、渲染器、渲染占位符等主题
附属物attachments就是渲染数组的#attached部分,这里称为“附属物”而不叫做“附件”,以便和图片、文件等概念相区别,附属物有如下8个类型(以在#attached中的键名列出,如果添加了其他键名将引起错误):
library:资源库,保存css、js、库js设置等,详见本系列资源库详解
drupalSettings:在渲染数组中设置的JavaScript 设置数据
html_head:在 HTML <head>部分的标签
html_head_link: 在 HTML <head>部分的<link>标签,是html_head的特殊情况
feed:RSS 订阅,是html_head_link的特殊情况
http_header:HTTP 响应头和状态码等
placeholders:占位内容,严格说来这不算附属物,只是系统将其和附属物在同一个服务中处理
html_response_attachment_placeholders:保存四大类别附属物的占位符,见后
在系统中对附属物的处理是在派发kernel.response事件阶段:
订阅器服务:html_response.subscriber
类:\Drupal\Core\EventSubscriber\HtmlResponseSubscriber
执行方法:onRespond
优先级:0-0
该订阅器只针对html响应进行处理:
\Drupal\Core\Render\HtmlResponse
只是起到简单的订阅事件作用,全部附属物处理工作在附属物处理器中进行,见下。
附属物处理器:
负责在上述订阅器中对HTML响应进行附属物占位符替换处理
服务名:html_response.attachments_processor
类:Drupal\Core\Render\HtmlResponseAttachmentsProcessor
获取方法:\Drupal::service('html_response.attachments_processor');
该处理器只针对\Drupal\Core\Render\HtmlResponse响应,这也是系统HTML页面的主要响应,下文针对各类附属物单独讲解。
内容占位符placeholders:
placeholders严格说来不属于附属物,而是页面内容,往往是不合适缓存的需要动态产生的页面局部内容,需要内容占位的元素(元素即渲染数组)键名只能包含:'#lazy_builder', '#cache', '#create_placeholder','#weight', '#printed',其中'#lazy_builder'指定了一个回调用于产生真实内容的渲染数组,在html字符串中这样的内容先以占位符占位,占位符由渲染占位符产生器(服务id:render_pla