Issue #3067580 by alexpott, andypost, pooja saraah, Niklan, smustgrave: Deprecate the AJAX RenderElement

merge-requests/2965/head
catch 2023-01-03 10:27:28 +00:00
parent 8a2f6514b7
commit d4da802f09
4 changed files with 101 additions and 0 deletions

View File

@ -10,9 +10,22 @@ namespace Drupal\Core\Render\Element;
* @ingroup ajax
*
* @RenderElement("ajax")
*
* @deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an
* \Drupal\Core\Ajax\AjaxResponse instead.
*
* @see https://www.drupal.org/node/3068104
*/
class Ajax extends RenderElement {
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
@trigger_error('\Drupal\Core\Render\Element\Ajax is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Return an \Drupal\Core\Ajax\AjaxResponse instead. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED);
}
/**
* {@inheritdoc}
*/

View File

@ -107,6 +107,16 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana
// Otherwise, rebuild and cache.
$info = [];
$previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) {
// Ignore deprecations while building element information.
if ($severity === E_USER_DEPRECATED) {
// Don't execute PHP internal error handler.
return TRUE;
}
if ($previous_error_handler) {
return $previous_error_handler($severity, $message, $file, $line);
}
});
foreach ($this->getDefinitions() as $element_type => $definition) {
$element = $this->createInstance($element_type);
$element_info = $element->getInfo();
@ -119,6 +129,7 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana
}
$info[$element_type] = $element_info;
}
restore_error_handler();
foreach ($info as $element_type => $element) {
$info[$element_type]['#type'] = $element_type;

View File

@ -0,0 +1,29 @@
<?php
namespace Drupal\element_info_test\Element;
use Drupal\Core\Render\Element\RenderElement;
/**
* Provides deprecated render element for testing.
*
* @RenderElement("deprecated")
*/
class Deprecated extends RenderElement {
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
@trigger_error(__CLASS__ . ' is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', E_USER_DEPRECATED);
}
/**
* {@inheritdoc}
*/
public function getInfo() {
return [];
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace Drupal\KernelTests\Core\Render\Element;
use Drupal\KernelTests\KernelTestBase;
/**
* @group Render
*/
class DeprecatedElementTest extends KernelTestBase {
/**
* {@inheritdoc}
*/
protected static $modules = ['element_info_test'];
/**
* Tests that render elements can trigger deprecations in their constructor.
*/
public function testBuildInfo() {
$info_manager = $this->container->get('plugin.manager.element_info');
$this->assertSame([
'#type' => 'deprecated',
'#defaults_loaded' => TRUE,
], $info_manager->getInfo('deprecated'));
// Ensure the constructor is triggering a deprecation error.
$previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) {
// Convert deprecation error into a catchable exception.
if ($severity === E_USER_DEPRECATED) {
throw new \ErrorException($message, 0, $severity, $file, $line);
}
if ($previous_error_handler) {
return $previous_error_handler($severity, $message, $file, $line);
}
});
try {
$info_manager->createInstance('deprecated');
$this->fail('No deprecation error triggered.');
}
catch (\ErrorException $e) {
$this->assertSame('Drupal\element_info_test\Element\Deprecated is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. See https://www.drupal.org/node/3068104', $e->getMessage());
}
restore_error_handler();
}
}