You are here

protected function EntityViewTrait::buildEntityView in Drupal 10

Same name and namespace in other branches
  1. 8 core/tests/Drupal/Tests/EntityViewTrait.php \Drupal\Tests\EntityViewTrait::buildEntityView()
  2. 9 core/tests/Drupal/Tests/EntityViewTrait.php \Drupal\Tests\EntityViewTrait::buildEntityView()

Builds the renderable view of an entity.

Entities postpone the composition of their renderable arrays to #pre_render functions in order to maximize cache efficacy. This means that the full renderable array for an entity is constructed in \Drupal::service('renderer')->render(). Some tests require the complete renderable array for an entity outside of the render process in order to verify the presence of specific values. This method isolates the steps in the render process that produce an entity's renderable array.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity to prepare a renderable array for.

string $view_mode: (optional) The view mode that should be used to build the entity.

null $langcode: (optional) For which language the entity should be prepared, defaults to the current content language.

Return value

array

See also

\Drupal\Core\Render\RendererInterface::render()

File

core/tests/Drupal/Tests/EntityViewTrait.php, line 36

Class

EntityViewTrait
Provides helper methods to deal with building entity views in tests.

Namespace

Drupal\Tests

Code

protected function buildEntityView(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
  $ensure_fully_built = function (&$elements) use (&$ensure_fully_built) {

    // If the default values for this element have not been loaded yet, populate
    // them.
    if (isset($elements['#type']) && empty($elements['#defaults_loaded'])) {
      $elements += \Drupal::service('element_info')
        ->getInfo($elements['#type']);
    }

    // Make any final changes to the element before it is rendered. This means
    // that the $element or the children can be altered or corrected before the
    // element is rendered into the final text.
    if (isset($elements['#pre_render'])) {
      foreach ($elements['#pre_render'] as $callable) {
        $elements = call_user_func($callable, $elements);
      }
    }

    // And recurse.
    $children = Element::children($elements, TRUE);
    foreach ($children as $key) {
      $ensure_fully_built($elements[$key]);
    }
  };
  $render_controller = $this->container
    ->get('entity_type.manager')
    ->getViewBuilder($entity
    ->getEntityTypeId());
  $build = $render_controller
    ->view($entity, $view_mode, $langcode);
  $ensure_fully_built($build);
  return $build;
}