Issue #2363139 by Wim Leers, dawehner, larowlan: _content controllers may only return render arrays, not strings.

8.0.x
Alex Pott 2014-10-27 14:13:28 +00:00
parent c71025a156
commit 961f188881
15 changed files with 51 additions and 45 deletions

View File

@ -49,13 +49,16 @@ class HtmlControllerBase {
/** /**
* Converts a render array into an HtmlFragment object. * Converts a render array into an HtmlFragment object.
* *
* @param array|string $page_content * @param array|\Drupal\Core\Page\HtmlFragmentInterface|\Symfony\Component\HttpFoundation\Response $page_content
* The page content area to display. * The page content area to display.
* @param \Symfony\Component\HttpFoundation\Request $request * @param \Symfony\Component\HttpFoundation\Request $request
* The request object. * The request object.
* *
* @return \Drupal\Core\Page\HtmlPage * @return \Drupal\Core\Page\HtmlPage
* A page object. * A page object.
*
* @throws \InvalidArgumentException
* Thrown if the controller returns a string.
*/ */
protected function createHtmlFragment($page_content, Request $request) { protected function createHtmlFragment($page_content, Request $request) {
// Allow controllers to return a HtmlFragment or a Response object directly. // Allow controllers to return a HtmlFragment or a Response object directly.
@ -63,8 +66,8 @@ class HtmlControllerBase {
return $page_content; return $page_content;
} }
if (!is_array($page_content)) { if (is_string($page_content)) {
$page_content = ['#markup' => $page_content]; throw new \InvalidArgumentException('_content controllers are not allowed to return strings. You can return a render array, a html fragment or a response object.');
} }
$fragment = $this->renderHtmlRenderer->render($page_content); $fragment = $this->renderHtmlRenderer->render($page_content);

View File

@ -194,7 +194,7 @@ function ajax_forms_test_advanced_commands_settings_with_merging_callback($form,
function ajax_forms_test_validation_form_callback($form, FormStateInterface $form_state) { function ajax_forms_test_validation_form_callback($form, FormStateInterface $form_state) {
drupal_set_message("ajax_forms_test_validation_form_callback invoked"); drupal_set_message("ajax_forms_test_validation_form_callback invoked");
drupal_set_message(t("Callback: drivertext=%drivertext, spare_required_field=%spare_required_field", array('%drivertext' => $form_state->getValue('drivertext'), '%spare_required_field' => $form_state->getValue('spare_required_field')))); drupal_set_message(t("Callback: drivertext=%drivertext, spare_required_field=%spare_required_field", array('%drivertext' => $form_state->getValue('drivertext'), '%spare_required_field' => $form_state->getValue('spare_required_field'))));
return '<div id="message_area">ajax_forms_test_validation_form_callback at ' . date('c') . '</div>'; return ['#markup' => '<div id="message_area">ajax_forms_test_validation_form_callback at ' . date('c') . '</div>'];
} }
/** /**
@ -203,7 +203,7 @@ function ajax_forms_test_validation_form_callback($form, FormStateInterface $for
function ajax_forms_test_validation_number_form_callback($form, FormStateInterface $form_state) { function ajax_forms_test_validation_number_form_callback($form, FormStateInterface $form_state) {
drupal_set_message("ajax_forms_test_validation_number_form_callback invoked"); drupal_set_message("ajax_forms_test_validation_number_form_callback invoked");
drupal_set_message(t("Callback: drivernumber=%drivernumber, spare_required_field=%spare_required_field", array('%drivernumber' => $form_state->getValue('drivernumber'), '%spare_required_field' => $form_state->getValue('spare_required_field')))); drupal_set_message(t("Callback: drivernumber=%drivernumber, spare_required_field=%spare_required_field", array('%drivernumber' => $form_state->getValue('drivernumber'), '%spare_required_field' => $form_state->getValue('spare_required_field'))));
return '<div id="message_area_number">ajax_forms_test_validation_number_form_callback at ' . date('c') . '</div>'; return ['#markup' => '<div id="message_area_number">ajax_forms_test_validation_number_form_callback at ' . date('c') . '</div>'];
} }
/** /**

View File

@ -88,7 +88,7 @@ class EntityTestController extends ControllerBase {
* @see \Drupal\entity_test\Routing\EntityTestRoutes::routes() * @see \Drupal\entity_test\Routing\EntityTestRoutes::routes()
*/ */
public function testAdmin() { public function testAdmin() {
return ''; return [];
} }
/** /**

View File

@ -53,7 +53,7 @@ class ErrorTestController extends ControllerBase {
$awesomely_big = 1/0; $awesomely_big = 1/0;
// This will generate a user error. // This will generate a user error.
trigger_error("Drupal is awesome", E_USER_WARNING); trigger_error("Drupal is awesome", E_USER_WARNING);
return ""; return [];
} }
/** /**

View File

@ -91,7 +91,7 @@ function menu_test_menu_local_tasks_alter(&$data, $route_name) {
* @deprecated Use \Drupal\menu_test\Controller\MenuTestController::menuTestCallback() * @deprecated Use \Drupal\menu_test\Controller\MenuTestController::menuTestCallback()
*/ */
function menu_test_callback() { function menu_test_callback() {
return 'This is menu_test_callback().'; return ['#markup' => 'This is menu_test_callback().'];
} }
/** /**
@ -117,7 +117,7 @@ function menu_test_theme_page_callback($inherited = FALSE) {
if ($inherited) { if ($inherited) {
$output .= ' Theme negotiation inheritance is being tested.'; $output .= ' Theme negotiation inheritance is being tested.';
} }
return $output; return ['#markup' => $output];
} }
/** /**

View File

@ -19,28 +19,28 @@ class TestControllers {
* Returns page to be used as a login path. * Returns page to be used as a login path.
*/ */
public function testLogin() { public function testLogin() {
return 'This is TestControllers::testLogin.'; return ['#markup' => 'This is TestControllers::testLogin.'];
} }
/** /**
* Prints out test data. * Prints out test data.
*/ */
public function test1() { public function test1() {
return 'test1'; return ['#markup' => 'test1'];
} }
/** /**
* Prints out test data. * Prints out test data.
*/ */
public function test2() { public function test2() {
return 'test2'; return ['#markup' => 'test2'];
} }
/** /**
* Prints out test data. * Prints out test data.
*/ */
public function testDerived() { public function testDerived() {
return 'testDerived'; return ['#markup' => 'testDerived'];
} }
/** /**
@ -54,10 +54,10 @@ class TestControllers {
*/ */
public function testDefaults($placeholder = NULL) { public function testDefaults($placeholder = NULL) {
if ($placeholder) { if ($placeholder) {
return String::format("Sometimes there is a placeholder: '@placeholder'.", array('@placeholder' => $placeholder)); return ['#markup' => String::format("Sometimes there is a placeholder: '@placeholder'.", array('@placeholder' => $placeholder))];
} }
else { else {
return String::format('Sometimes there is no placeholder.'); return ['#markup' => String::format('Sometimes there is no placeholder.')];
} }
} }

View File

@ -30,7 +30,7 @@ class ModuleTestController {
* @todo Remove module_test_class_loading(). * @todo Remove module_test_class_loading().
*/ */
public function testClassLoading() { public function testClassLoading() {
return module_test_class_loading(); return ['#markup' => module_test_class_loading()];
} }
} }

View File

@ -19,14 +19,14 @@ class TestControllers {
public function testUserNodeFoo(EntityInterface $user, NodeInterface $node, Request $request) { public function testUserNodeFoo(EntityInterface $user, NodeInterface $node, Request $request) {
$foo = $request->attributes->get('foo'); $foo = $request->attributes->get('foo');
$foo = is_object($foo) ? $foo->label() : $foo; $foo = is_object($foo) ? $foo->label() : $foo;
return "user: {$user->label()}, node: {$node->label()}, foo: $foo"; return ['#markup' => "user: {$user->label()}, node: {$node->label()}, foo: $foo"];
} }
public function testNodeSetParent(NodeInterface $node, NodeInterface $parent) { public function testNodeSetParent(NodeInterface $node, NodeInterface $parent) {
return "Setting '{$parent->label()}' as parent of '{$node->label()}'."; return ['#markup' => "Setting '{$parent->label()}' as parent of '{$node->label()}'."];
} }
public function testEntityLanguage(NodeInterface $node) { public function testEntityLanguage(NodeInterface $node) {
return $node->label(); return ['#markup' => $node->label()];
} }
} }

View File

@ -43,7 +43,7 @@ class TestContent extends ControllerBase {
* Provides example content for testing route enhancers. * Provides example content for testing route enhancers.
*/ */
public function test1() { public function test1() {
return 'abcde'; return ['#markup' => 'abcde'];
} }
/** /**
@ -54,13 +54,13 @@ class TestContent extends ControllerBase {
*/ */
public function test11() { public function test11() {
$account = $this->currentUser(); $account = $this->currentUser();
return $account->getUsername(); return ['#markup' => $account->getUsername()];
} }
public function testAccount(UserInterface $user) { public function testAccount(UserInterface $user) {
$current_user_name = $this->currentUser()->getUsername(); $current_user_name = $this->currentUser()->getUsername();
$this->currentUser()->setAccount($user); $this->currentUser()->setAccount($user);
return $current_user_name . ':' . $user->getUsername(); return ['#markup' => $current_user_name . ':' . $user->getUsername()];
} }
/** /**

View File

@ -26,19 +26,19 @@ class TestControllers {
} }
public function test2() { public function test2() {
return "test2"; return ['#markup' => "test2"];
} }
public function test3($value) { public function test3($value) {
return $value; return ['#markup' => $value];
} }
public function test4($value) { public function test4($value) {
return $value; return ['#markup' => $value];
} }
public function test5() { public function test5() {
return "test5"; return ['#markup' => "test5"];
} }
public function test6() { public function test6() {

View File

@ -24,8 +24,8 @@ class SessionTestController extends ControllerBase {
*/ */
public function get() { public function get() {
return empty($_SESSION['session_test_value']) return empty($_SESSION['session_test_value'])
? "" ? []
: $this->t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value'])); : ['#markup' => $this->t('The current value of the stored session variable is: %val', array('%val' => $_SESSION['session_test_value']))];
} }
/** /**
@ -41,7 +41,7 @@ class SessionTestController extends ControllerBase {
\Drupal::service('session_manager')->save(); \Drupal::service('session_manager')->save();
return 'session_id:' . session_id() . "\n"; return ['#markup' => 'session_id:' . session_id() . "\n"];
} }
/** /**
@ -54,7 +54,7 @@ class SessionTestController extends ControllerBase {
* A notification message with session ID. * A notification message with session ID.
*/ */
public function getIdFromCookie(Request $request) { public function getIdFromCookie(Request $request) {
return 'session_id:' . $request->cookies->get(session_name()) . "\n"; return ['#markup' => 'session_id:' . $request->cookies->get(session_name()) . "\n"];
} }
/** /**
@ -69,7 +69,7 @@ class SessionTestController extends ControllerBase {
public function set($test_value) { public function set($test_value) {
$_SESSION['session_test_value'] = $test_value; $_SESSION['session_test_value'] = $test_value;
return $this->t('The current value of the stored session variable has been set to %val', array('%val' => $test_value)); return ['#markup' => $this->t('The current value of the stored session variable has been set to %val', array('%val' => $test_value))];
} }
/** /**
@ -85,7 +85,7 @@ class SessionTestController extends ControllerBase {
public function noSet($test_value) { public function noSet($test_value) {
\Drupal::service('session_manager')->disable(); \Drupal::service('session_manager')->disable();
$this->set($test_value); $this->set($test_value);
return $this->t('session saving was disabled, and then %val was set', array('%val' => $test_value)); return ['#markup' => $this->t('session saving was disabled, and then %val was set', array('%val' => $test_value))];
} }
/** /**
@ -111,6 +111,7 @@ class SessionTestController extends ControllerBase {
public function setMessageButDontSave() { public function setMessageButDontSave() {
\Drupal::service('session_manager')->disable(); \Drupal::service('session_manager')->disable();
$this->setMessage(); $this->setMessage();
return ['#markup' => ''];
} }
/** /**
@ -124,6 +125,7 @@ class SessionTestController extends ControllerBase {
if (!drupal_session_will_start()) { if (!drupal_session_will_start()) {
$this->set($this->t('Session was not started')); $this->set($this->t('Session was not started'));
} }
return ['#markup' => ''];
} }
/** /**
@ -133,6 +135,6 @@ class SessionTestController extends ControllerBase {
* A notification message. * A notification message.
*/ */
public function isLoggedIn() { public function isLoggedIn() {
return $this->t('User is logged in.'); return ['#markup' => $this->t('User is logged in.')];
} }
} }

View File

@ -49,7 +49,7 @@ class SystemTestController extends ControllerBase {
* The text to display. * The text to display.
*/ */
public function mainContentFallback() { public function mainContentFallback() {
return $this->t('Content to test main content fallback'); return ['#markup' => $this->t('Content to test main content fallback')];
} }
/** /**
@ -65,7 +65,7 @@ class SystemTestController extends ControllerBase {
// Remove the first. // Remove the first.
unset($_SESSION['messages']['status'][0]); unset($_SESSION['messages']['status'][0]);
return ''; return [];
} }
/** /**
@ -93,10 +93,10 @@ class SystemTestController extends ControllerBase {
*/ */
public function lockPersist($lock_name) { public function lockPersist($lock_name) {
if ($this->persistentLock->acquire($lock_name)) { if ($this->persistentLock->acquire($lock_name)) {
return 'TRUE: Lock successfully acquired in SystemTestController::lockPersist()'; return ['#markup' => 'TRUE: Lock successfully acquired in SystemTestController::lockPersist()'];
} }
else { else {
return 'FALSE: Lock not acquired in SystemTestController::lockPersist()'; return ['#markup' => 'FALSE: Lock not acquired in SystemTestController::lockPersist()'];
} }
} }
@ -154,8 +154,9 @@ class SystemTestController extends ControllerBase {
// @see _drupal_shutdown_function() // @see _drupal_shutdown_function()
// @see \Drupal\system\Tests\System\ShutdownFunctionsTest // @see \Drupal\system\Tests\System\ShutdownFunctionsTest
if (function_exists('fastcgi_finish_request')) { if (function_exists('fastcgi_finish_request')) {
return 'The function fastcgi_finish_request exists when serving the request.'; return ['#markup' => 'The function fastcgi_finish_request exists when serving the request.'];
} }
return [];
} }
/** /**

View File

@ -72,10 +72,10 @@ function system_test_system_info_alter(&$info, Extension $file, $type) {
function system_test_lock_acquire() { function system_test_lock_acquire() {
if (\Drupal::lock()->acquire('system_test_lock_acquire')) { if (\Drupal::lock()->acquire('system_test_lock_acquire')) {
\Drupal::lock()->release('system_test_lock_acquire'); \Drupal::lock()->release('system_test_lock_acquire');
return 'TRUE: Lock successfully acquired in system_test_lock_acquire()'; return ['#markup' => 'TRUE: Lock successfully acquired in system_test_lock_acquire()'];
} }
else { else {
return 'FALSE: Lock not acquired in system_test_lock_acquire()'; return ['#markup' => 'FALSE: Lock not acquired in system_test_lock_acquire()'];
} }
} }
@ -91,7 +91,7 @@ function system_test_lock_exit() {
exit(); exit();
} }
else { else {
return 'FALSE: Lock not acquired in system_test_lock_exit()'; return ['#markup' => 'FALSE: Lock not acquired in system_test_lock_exit()'];
} }
} }

View File

@ -56,7 +56,7 @@ class ThemeTestController extends ControllerBase {
* A render array containing a theme override. * A render array containing a theme override.
*/ */
public function testTemplate() { public function testTemplate() {
return \Drupal::theme()->render('theme_test_template_test', array()); return ['#markup' => \Drupal::theme()->render('theme_test_template_test', array())];
} }
/** /**
@ -82,7 +82,7 @@ class ThemeTestController extends ControllerBase {
* An HTML string containing the themed output. * An HTML string containing the themed output.
*/ */
public function testSuggestion() { public function testSuggestion() {
return \Drupal::theme()->render(array('theme_test__suggestion', 'theme_test'), array()); return ['#markup' => \Drupal::theme()->render(array('theme_test__suggestion', 'theme_test'), array())];
} }
/** /**
@ -92,7 +92,7 @@ class ThemeTestController extends ControllerBase {
* Content in theme_test_output GLOBAL. * Content in theme_test_output GLOBAL.
*/ */
public function testRequestListener() { public function testRequestListener() {
return $GLOBALS['theme_test_output']; return ['#markup' => $GLOBALS['theme_test_output']];
} }
/** /**

View File

@ -18,7 +18,7 @@ class TwigThemeTestController {
* Menu callback for testing PHP variables in a Twig template. * Menu callback for testing PHP variables in a Twig template.
*/ */
public function phpVariablesRender() { public function phpVariablesRender() {
return \Drupal::theme()->render('twig_theme_test_php_variables', array()); return ['#markup' => \Drupal::theme()->render('twig_theme_test_php_variables', array())];
} }
/** /**