实体视图显示和表单显示在实现上有许多相似之处,许多类都共用了相同基类,有许多概念和知识已经在本系列的实体表单显示主题中介绍过,如显示模式及其定义等,本篇不再重复介绍,将假设读者已阅读过实体表单显示主题;视图这个词可能会让人感觉生涩,可以将其理解为查看、显示,实体视图构建就是产生实体的查看页面或数据。
从节点视图说起:
在drupal中最常见的是节点查看,网址如:/node/1,查看节点的路由名为:
entity.node.canonical
此路由在以下方法中动态定义:
\Drupal\node\Entity\NodeRouteProvider::getRoutes
对应的路由控制器:\Drupal\node\Controller\NodeViewController::view
该控制器继承自以下类:
\Drupal\Core\Entity\Controller\EntityViewController
该类是一个通用实体视图控制器类,如果路由定义中没有设置控制器,只设置了“_entity_view”,那么就会直接使用该类的view方法做控制器(该方法的参数已在路由系统中得到转化,请见参数转换相关主题),“_entity_view”在以下路由增强器中进行处理:
\Drupal\Core\Entity\Enhancer\EntityRouteEnhancer::enhanceEntityView
以上“_entity_view”的值是如下格式:
实体类型id.视图模式名
其中实体类型id是必不可少的,和视图模式以点号分隔,如果省略点号及视图模式名,则默认使用全文视图模式:“full”,但在默认情况下,full模式并没有开启,此时将回退使用default视图模式,如果开启了则full模式优先,注意这和默认表单模式直接采用“default”不同
这样的用法可参见用户实体的entity.user.canonical路由
由以上视图控制器类可见真正产生用于显示实体的渲染数组的是实体视图构建器,见下。
视图模式:
显示模式分为表单模式和视图模式,详见本系列实体表单显示主题,和表单模式一样,并不是所有实体类型都能运用视图模式,条件是实体类型定义中设置了根键field_ui_base_route且不能为空,且定义了视图构建器。详见以下类:
\Drupal\field_ui\Controller\EntityDisplayModeController
这意味着只有内容实体类型才能设置显示模式,默认安装中有六个实体类型可以设置,实体类型id如下:
block_content(自定义区块)
comment(评论)
contact_message(联系信息)
node(内容)
taxonomy_term(分类术语)
user(用户)
他们都是内容实体类型,在drupal中内容实体类型继承自可字段化实体类型,视图显示模式即是用于管理哪些字段被显示及如何显示
实体视图构建器:
实体视图构建器在实体释文中定义,用于构建显示实体的渲染数组,获取方法如下:
$viewBuilder=\Drupal::entityTypeManager()->getViewBuilder($entityTypeID);
获取后产生显示渲染数组:
$renderArr =$viewBuilder->view($entity, $view_mode);
要显示一个节点实体,可以在控制器中执行以下代码:
$node = \Drupal::entityTypeManager()->getStorage('node')->load(34);
$viewBuilder=\Drupal::entityTypeManager()->getViewBuilder('node');
return $renderArr =$viewBuilder->view($node);
和表单不同的是也可以同时渲染多个实体:
$nodes[] = \Drupal::entityTypeManager()->getStorage('node')->load(34);
$nodes[] = \Drupal::entityTypeManager()->getStorage('node')->load(37);
$viewBuilder=\Drupal::entityTypeManager()->getViewBuilder('node');
return $renderArr =$viewBuilder->viewMultiple($nodes);
视图构建器是一种实体处理器,定义在实体释文处理器键下的“view_builder”键中,按照处理器流程实例化,即如果实现了处理器接口,将从以下静态方法得到实例对象: