Issue #2779807 by jhedstrom: Bring RestExport::buildResponse into line with Feed::buildResponse
parent
4221911a94
commit
2a43f31fb7
|
@ -353,12 +353,17 @@ class RestExport extends PathPluginBase implements ResponseDisplayPluginInterfac
|
||||||
public static function buildResponse($view_id, $display_id, array $args = []) {
|
public static function buildResponse($view_id, $display_id, array $args = []) {
|
||||||
$build = static::buildBasicRenderable($view_id, $display_id, $args);
|
$build = static::buildBasicRenderable($view_id, $display_id, $args);
|
||||||
|
|
||||||
|
// Setup an empty response so headers can be added as needed during views
|
||||||
|
// rendering and processing.
|
||||||
|
$response = new CacheableResponse('', 200);
|
||||||
|
$build['#response'] = $response;
|
||||||
|
|
||||||
/** @var \Drupal\Core\Render\RendererInterface $renderer */
|
/** @var \Drupal\Core\Render\RendererInterface $renderer */
|
||||||
$renderer = \Drupal::service('renderer');
|
$renderer = \Drupal::service('renderer');
|
||||||
|
|
||||||
$output = $renderer->renderRoot($build);
|
$output = (string) $renderer->renderRoot($build);
|
||||||
|
|
||||||
$response = new CacheableResponse($output, 200);
|
$response->setContent($output);
|
||||||
$cache_metadata = CacheableMetadata::createFromRenderArray($build);
|
$cache_metadata = CacheableMetadata::createFromRenderArray($build);
|
||||||
$response->addCacheableDependency($cache_metadata);
|
$response->addCacheableDependency($cache_metadata);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Test hook implementations for the REST views test module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Drupal\views\ViewExecutable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_views_post_execute().
|
||||||
|
*/
|
||||||
|
function rest_test_views_views_post_execute(ViewExecutable $view) {
|
||||||
|
// Attach a custom header to the test_data_export view.
|
||||||
|
if ($view->id() === 'test_serializer_display_entity') {
|
||||||
|
if ($value = \Drupal::state()->get('rest_test_views_set_header', FALSE)) {
|
||||||
|
$view->getResponse()->headers->set('Custom-Header', $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\Tests\rest\Kernel\Views;
|
||||||
|
|
||||||
|
use Drupal\rest\Plugin\views\display\RestExport;
|
||||||
|
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
|
||||||
|
use Drupal\views\Entity\View;
|
||||||
|
use Drupal\views\Tests\ViewTestData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the REST export view display plugin.
|
||||||
|
*
|
||||||
|
* @coversDefaultClass \Drupal\rest\Plugin\views\display\RestExport
|
||||||
|
*
|
||||||
|
* @group rest
|
||||||
|
*/
|
||||||
|
class RestExportTest extends ViewsKernelTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $testViews = ['test_serializer_display_entity'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static $modules = ['rest_test_views', 'serialization', 'rest', 'entity_test'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function setUp($import_test_views = TRUE) {
|
||||||
|
parent::setUp($import_test_views);
|
||||||
|
|
||||||
|
ViewTestData::createTestViews(get_class($this), ['rest_test_views']);
|
||||||
|
$this->installEntitySchema('entity_test');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::buildResponse
|
||||||
|
*/
|
||||||
|
public function testBuildResponse() {
|
||||||
|
/** @var \Drupal\views\Entity\View $view */
|
||||||
|
$view = View::load('test_serializer_display_entity');
|
||||||
|
$display = &$view->getDisplay('rest_export_1');
|
||||||
|
|
||||||
|
$display['display_options']['defaults']['style'] = FALSE;
|
||||||
|
$display['display_options']['style']['type'] = 'serializer';
|
||||||
|
$display['display_options']['style']['options']['formats'] = ['json', 'xml'];
|
||||||
|
$view->save();
|
||||||
|
|
||||||
|
// No custom header should be set yet.
|
||||||
|
$response = RestExport::buildResponse('test_serializer_display_entity', 'rest_export_1', []);
|
||||||
|
$this->assertFalse($response->headers->get('Custom-Header'));
|
||||||
|
|
||||||
|
// Clear render cache.
|
||||||
|
/** @var \Drupal\Core\Cache\MemoryBackend $render_cache */
|
||||||
|
$render_cache = $this->container->get('cache_factory')->get('render');
|
||||||
|
$render_cache->deleteAll();
|
||||||
|
|
||||||
|
// A custom header should now be added.
|
||||||
|
// @see rest_test_views_views_post_execute()
|
||||||
|
$header = $this->randomString();
|
||||||
|
$this->container->get('state')->set('rest_test_views_set_header', $header);
|
||||||
|
$response = RestExport::buildResponse('test_serializer_display_entity', 'rest_export_1', []);
|
||||||
|
$this->assertEquals($header, $response->headers->get('Custom-Header'));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue