diff --git a/core/lib/Drupal/Component/Render/FormattableMarkup.php b/core/lib/Drupal/Component/Render/FormattableMarkup.php index 6cebd3e3a1ac183886dfc1b8f9fa4a7eb99fe1ec..a71fca8bf6145e444b1579900da61e52cc3b1f7b 100644 --- a/core/lib/Drupal/Component/Render/FormattableMarkup.php +++ b/core/lib/Drupal/Component/Render/FormattableMarkup.php @@ -130,9 +130,8 @@ public function jsonSerialize(): string { * An associative array of replacements. Each array key should be the same * as a placeholder in $string. The corresponding value should be a string * or an object that implements \Drupal\Component\Render\MarkupInterface. - * Null args[] values are deprecated in Drupal 9.5 and will fail in - * Drupal 11.0. The value replaces the placeholder in $string. Sanitization - * and formatting will be done before replacement. The type of sanitization + * The args[] value replaces the placeholder in $string. Sanitization and + * formatting will be done before replacement. The type of sanitization * and formatting depends on the first character of the key: * - @variable: When the placeholder replacement value is: * - A string, the replaced value in the returned string will be sanitized @@ -194,15 +193,6 @@ public function jsonSerialize(): string { protected static function placeholderFormat($string, array $args) { // Transform arguments before inserting them. foreach ($args as $key => $value) { - if (is_null($value)) { - // It's probably a bug to provide a null value for the placeholder arg, - // and in D11 this will no longer be allowed. When this trigger_error - // is removed, also remove isset $value checks inside the switch{} - // below. - // phpcs:ignore Drupal.Semantics.FunctionTriggerError - @trigger_error(sprintf('Deprecated NULL placeholder value for key (%s) in: "%s". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826', (string) $key, (string) $string), E_USER_DEPRECATED); - $value = ''; - } switch ($key[0]) { case '@': // Escape if the value is not an object from a class that implements diff --git a/core/lib/Drupal/Core/Render/Element/Ajax.php b/core/lib/Drupal/Core/Render/Element/Ajax.php deleted file mode 100644 index 28353c2e7b27af1d8313202bc71d0ab89d927c07..0000000000000000000000000000000000000000 --- a/core/lib/Drupal/Core/Render/Element/Ajax.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -namespace Drupal\Core\Render\Element; - -use Drupal\Core\Render\Attribute\RenderElement; - -/** - * Provides a render element for adding Ajax to a render element. - * - * Holds an array whose values control the Ajax behavior of the element. - * - * @ingroup 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 - */ -#[RenderElement('ajax')] -class Ajax extends RenderElementBase { - - /** - * {@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} - */ - public function getInfo() { - // By default, we don't want Ajax commands being rendered in the context of - // an HTML page, so we don't provide defaults for #theme or #theme_wrappers. - // However, modules can set these properties (for example, to provide an - // HTML debugging page that displays rather than executes Ajax commands). - return [ - '#header' => TRUE, - '#commands' => [], - '#error' => NULL, - ]; - } - -} diff --git a/core/lib/Drupal/Core/Render/Element/RenderElementBase.php b/core/lib/Drupal/Core/Render/Element/RenderElementBase.php index 84230b5c14f0e7ee577f69bb8acb5ad4d94f5c85..aa2da90eba8ac3f2e8dd92553c6a66dd6129a280 100644 --- a/core/lib/Drupal/Core/Render/Element/RenderElementBase.php +++ b/core/lib/Drupal/Core/Render/Element/RenderElementBase.php @@ -372,12 +372,6 @@ public static function preRenderAjaxForm($element) { $settings['options']['query'][FormBuilderInterface::AJAX_FORM_REQUEST] = TRUE; } - // @todo Legacy support. Remove in Drupal 8. - if (isset($settings['method']) && $settings['method'] == 'replace') { - @trigger_error('Using "replace" as the method in #ajax property is deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use "replaceWith" instead. See https://www.drupal.org/project/drupal/issues/3303557', E_USER_DEPRECATED); - $settings['method'] = 'replaceWith'; - } - // Convert \Drupal\Core\Url object to string. if (isset($settings['url']) && $settings['url'] instanceof Url) { $url = $settings['url']->setOptions($settings['options'])->toString(TRUE); diff --git a/core/lib/Drupal/Core/Render/ElementInfoManager.php b/core/lib/Drupal/Core/Render/ElementInfoManager.php index a2efac850894b3e676c3744f088951a8a437c659..e01630258d9ab8f85799c0afdb7a16dce5ac8c02 100644 --- a/core/lib/Drupal/Core/Render/ElementInfoManager.php +++ b/core/lib/Drupal/Core/Render/ElementInfoManager.php @@ -3,8 +3,6 @@ namespace Drupal\Core\Render; use Drupal\Core\Cache\CacheBackendInterface; -use Drupal\Core\Cache\CacheTagsInvalidatorInterface; -use Drupal\Core\DependencyInjection\DeprecatedServicePropertyTrait; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Extension\ThemeHandlerInterface; use Drupal\Core\Plugin\DefaultPluginManager; @@ -25,15 +23,6 @@ */ class ElementInfoManager extends DefaultPluginManager implements ElementInfoManagerInterface { - use DeprecatedServicePropertyTrait; - - /** - * Defines deprecated injected properties. - * - * @var array - */ - protected array $deprecatedProperties = ['cacheTagInvalidator' => 'cache_tags.invalidator']; - /** * Stores the available element information. * @@ -41,20 +30,6 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana */ protected $elementInfo; - /** - * The theme manager. - * - * @var \Drupal\Core\Theme\ThemeManagerInterface - */ - protected $themeManager; - - /** - * The theme handler. - * - * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface - */ - protected $themeHandler; - /** * Constructs an ElementInfoManager object. * @@ -63,22 +38,21 @@ class ElementInfoManager extends DefaultPluginManager implements ElementInfoMana * keyed by the corresponding namespace to look for plugin implementations. * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend * Cache backend instance to use. - * @param \Drupal\Core\Extension\ThemeHandlerInterface|\Drupal\Core\Cache\CacheTagsInvalidatorInterface $theme_handler + * @param \Drupal\Core\Extension\ThemeHandlerInterface $themeHandler * The theme handler. * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler * The module handler to invoke the alter hook with. - * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager + * @param \Drupal\Core\Theme\ThemeManagerInterface $themeManager * The theme manager. */ - public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ThemeHandlerInterface|CacheTagsInvalidatorInterface $theme_handler, ModuleHandlerInterface $module_handler, ThemeManagerInterface $theme_manager) { + public function __construct( + \Traversable $namespaces, + CacheBackendInterface $cache_backend, + protected ThemeHandlerInterface $themeHandler, + ModuleHandlerInterface $module_handler, + protected ThemeManagerInterface $themeManager, + ) { $this->setCacheBackend($cache_backend, 'element_info'); - $this->themeManager = $theme_manager; - if ($theme_handler instanceof CacheTagsInvalidatorInterface) { - @trigger_error('Calling ' . __METHOD__ . '() with the $cache_tag_invalidator argument is deprecated in drupal:10.2.0 and will be removed in drupal:11.0.0. Pass $theme_handler instead. See https://www.drupal.org/node/3355227', E_USER_DEPRECATED); - $theme_handler = \Drupal::service('theme_handler'); - } - $this->themeHandler = $theme_handler; - parent::__construct('Element', $namespaces, $module_handler, 'Drupal\Core\Render\Element\ElementInterface', RenderElement::class, 'Drupal\Core\Render\Annotation\RenderElement'); $this->alterInfo('element_plugin'); } diff --git a/core/lib/Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php b/core/lib/Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php index 9cb8e0a848fb0644c8d03a2f5db952b5d5742055..014897f8066022f39ee9ea70f6ddc287f08a9f15 100644 --- a/core/lib/Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php +++ b/core/lib/Drupal/Core/Render/HtmlResponseAttachmentsProcessor.php @@ -33,13 +33,6 @@ */ class HtmlResponseAttachmentsProcessor implements AttachmentsResponseProcessorInterface { - /** - * The asset resolver service. - * - * @var \Drupal\Core\Asset\AssetResolverInterface - */ - protected $assetResolver; - /** * A config object for the system performance configuration. * @@ -47,74 +40,37 @@ class HtmlResponseAttachmentsProcessor implements AttachmentsResponseProcessorIn */ protected $config; - /** - * The CSS asset collection renderer service. - * - * @var \Drupal\Core\Asset\AssetCollectionRendererInterface - */ - protected $cssCollectionRenderer; - - /** - * The JS asset collection renderer service. - * - * @var \Drupal\Core\Asset\AssetCollectionRendererInterface - */ - protected $jsCollectionRenderer; - - /** - * The request stack. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected $requestStack; - - /** - * The renderer. - * - * @var \Drupal\Core\Render\RendererInterface - */ - protected $renderer; - - /** - * The module handler service. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - /** * Constructs a HtmlResponseAttachmentsProcessor object. * - * @param \Drupal\Core\Asset\AssetResolverInterface $asset_resolver + * @param \Drupal\Core\Asset\AssetResolverInterface $assetResolver * An asset resolver. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * A config factory for retrieving required config objects. - * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $css_collection_renderer + * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $cssCollectionRenderer * The CSS asset collection renderer. - * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $js_collection_renderer + * @param \Drupal\Core\Asset\AssetCollectionRendererInterface $jsCollectionRenderer * The JS asset collection renderer. - * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack * The request stack. * @param \Drupal\Core\Render\RendererInterface $renderer * The renderer. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler * The module handler service. - * @param \Drupal\Core\Language\LanguageManagerInterface|null $languageManager + * @param \Drupal\Core\Language\LanguageManagerInterface $languageManager * The language manager. */ - public function __construct(AssetResolverInterface $asset_resolver, ConfigFactoryInterface $config_factory, AssetCollectionRendererInterface $css_collection_renderer, AssetCollectionRendererInterface $js_collection_renderer, RequestStack $request_stack, RendererInterface $renderer, ModuleHandlerInterface $module_handler, protected ?LanguageManagerInterface $languageManager = NULL) { - $this->assetResolver = $asset_resolver; + public function __construct( + protected AssetResolverInterface $assetResolver, + ConfigFactoryInterface $config_factory, + protected AssetCollectionRendererInterface $cssCollectionRenderer, + protected AssetCollectionRendererInterface $jsCollectionRenderer, + protected RequestStack $requestStack, + protected RendererInterface $renderer, + protected ModuleHandlerInterface $moduleHandler, + protected LanguageManagerInterface $languageManager, + ) { $this->config = $config_factory->get('system.performance'); - $this->cssCollectionRenderer = $css_collection_renderer; - $this->jsCollectionRenderer = $js_collection_renderer; - $this->requestStack = $request_stack; - $this->renderer = $renderer; - $this->moduleHandler = $module_handler; - if (!isset($languageManager)) { - // phpcs:ignore Drupal.Semantics.FunctionTriggerError - @trigger_error('Calling ' . __METHOD__ . '() without the $languageManager argument is deprecated in drupal:10.1.0 and will be required in drupal:11.0.0', E_USER_DEPRECATED); - $this->languageManager = \Drupal::languageManager(); - } } /** diff --git a/core/lib/Drupal/Core/Render/PlaceholderingRenderCache.php b/core/lib/Drupal/Core/Render/PlaceholderingRenderCache.php index d1bd1af90a72b2c938802ee55d0a2c3d879951fa..e73b61214309aaef58cf06bff508f7c7b31f7f98 100644 --- a/core/lib/Drupal/Core/Render/PlaceholderingRenderCache.php +++ b/core/lib/Drupal/Core/Render/PlaceholderingRenderCache.php @@ -2,8 +2,8 @@ namespace Drupal\Core\Render; -use Drupal\Core\Cache\CacheFactoryInterface; use Drupal\Core\Cache\Context\CacheContextsManager; +use Drupal\Core\Cache\VariationCacheFactoryInterface; use Symfony\Component\HttpFoundation\RequestStack; /** @@ -39,13 +39,6 @@ */ class PlaceholderingRenderCache extends RenderCache { - /** - * The placeholder generator. - * - * @var \Drupal\Core\Render\PlaceholderGeneratorInterface - */ - protected $placeholderGenerator; - /** * Stores rendered results for automatically placeholdered elements. * @@ -74,22 +67,22 @@ class PlaceholderingRenderCache extends RenderCache { /** * Constructs a new PlaceholderingRenderCache object. * - * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack * The request stack. - * @param \Drupal\Core\Cache\VariationCacheFactoryInterface $cache_factory + * @param \Drupal\Core\Cache\VariationCacheFactoryInterface $cacheFactory * The variation cache factory. - * @param \Drupal\Core\Cache\Context\CacheContextsManager $cache_contexts_manager + * @param \Drupal\Core\Cache\Context\CacheContextsManager $cacheContextsManager * The cache contexts manager. - * @param \Drupal\Core\Render\PlaceholderGeneratorInterface $placeholder_generator + * @param \Drupal\Core\Render\PlaceholderGeneratorInterface $placeholderGenerator * The placeholder generator. */ - public function __construct(RequestStack $request_stack, $cache_factory, CacheContextsManager $cache_contexts_manager, PlaceholderGeneratorInterface $placeholder_generator) { - if ($cache_factory instanceof CacheFactoryInterface) { - @trigger_error('Injecting ' . __CLASS__ . ' with the "cache_factory" service is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Use "variation_cache_factory" instead. See https://www.drupal.org/node/3365546', E_USER_DEPRECATED); - $cache_factory = \Drupal::service('variation_cache_factory'); - } - parent::__construct($request_stack, $cache_factory, $cache_contexts_manager); - $this->placeholderGenerator = $placeholder_generator; + public function __construct( + RequestStack $requestStack, + VariationCacheFactoryInterface $cacheFactory, + CacheContextsManager $cacheContextsManager, + protected PlaceholderGeneratorInterface $placeholderGenerator, + ) { + parent::__construct($requestStack, $cacheFactory, $cacheContextsManager); } /** diff --git a/core/lib/Drupal/Core/Render/RenderCache.php b/core/lib/Drupal/Core/Render/RenderCache.php index c93079b507f6e8ad3621a1430aa8ab21575c62fb..61a6c26d35975c308938bc5983b0a9e725ebdd3b 100644 --- a/core/lib/Drupal/Core/Render/RenderCache.php +++ b/core/lib/Drupal/Core/Render/RenderCache.php @@ -3,8 +3,8 @@ namespace Drupal\Core\Render; use Drupal\Core\Cache\CacheableMetadata; -use Drupal\Core\Cache\CacheFactoryInterface; use Drupal\Core\Cache\Context\CacheContextsManager; +use Drupal\Core\Cache\VariationCacheFactoryInterface; use Symfony\Component\HttpFoundation\RequestStack; /** @@ -14,45 +14,21 @@ */ class RenderCache implements RenderCacheInterface { - /** - * The request stack. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected $requestStack; - - /** - * The variation cache factory. - * - * @var \Drupal\Core\Cache\VariationCacheFactoryInterface - */ - protected $cacheFactory; - - /** - * The cache contexts manager. - * - * @var \Drupal\Core\Cache\Context\CacheContextsManager - */ - protected $cacheContextsManager; - /** * Constructs a new RenderCache object. * - * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack * The request stack. - * @param \Drupal\Core\Cache\VariationCacheFactoryInterface $cache_factory + * @param \Drupal\Core\Cache\VariationCacheFactoryInterface $cacheFactory * The variation cache factory. - * @param \Drupal\Core\Cache\Context\CacheContextsManager $cache_contexts_manager + * @param \Drupal\Core\Cache\Context\CacheContextsManager $cacheContextsManager * The cache contexts manager. */ - public function __construct(RequestStack $request_stack, $cache_factory, CacheContextsManager $cache_contexts_manager) { - if ($cache_factory instanceof CacheFactoryInterface) { - @trigger_error('Injecting ' . __CLASS__ . ' with the "cache_factory" service is deprecated in drupal:10.1.0 and is removed from drupal:11.0.0. Use "variation_cache_factory" instead. See https://www.drupal.org/node/3365546', E_USER_DEPRECATED); - $cache_factory = \Drupal::service('variation_cache_factory'); - } - $this->requestStack = $request_stack; - $this->cacheFactory = $cache_factory; - $this->cacheContextsManager = $cache_contexts_manager; + public function __construct( + protected RequestStack $requestStack, + protected VariationCacheFactoryInterface $cacheFactory, + protected CacheContextsManager $cacheContextsManager, + ) { } /** diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php index a65c28537a184160fd4b5eebc0ae85795e8fdf9f..d36feab14e4311d357647a89297bb23116c72312 100644 --- a/core/lib/Drupal/Core/Render/Renderer.php +++ b/core/lib/Drupal/Core/Render/Renderer.php @@ -9,7 +9,6 @@ use Drupal\Core\Access\AccessResultInterface; use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\CacheableMetadata; -use Drupal\Core\Controller\ControllerResolverInterface; use Drupal\Core\Form\FormHelper; use Drupal\Core\Render\Element\RenderCallbackInterface; use Drupal\Core\Security\TrustedCallbackInterface; @@ -24,41 +23,6 @@ class Renderer implements RendererInterface { use DoTrustedCallbackTrait; - /** - * The theme manager. - * - * @var \Drupal\Core\Theme\ThemeManagerInterface - */ - protected $theme; - - /** - * The callable resolver. - * - * @var \Drupal\Core\Utility\CallableResolver - */ - protected CallableResolver $callableResolver; - - /** - * The element info. - * - * @var \Drupal\Core\Render\ElementInfoManagerInterface - */ - protected $elementInfo; - - /** - * The placeholder generator. - * - * @var \Drupal\Core\Render\PlaceholderGeneratorInterface - */ - protected $placeholderGenerator; - - /** - * The render cache service. - * - * @var \Drupal\Core\Render\RenderCacheInterface - */ - protected $renderCache; - /** * The renderer configuration array. * @@ -73,13 +37,6 @@ class Renderer implements RendererInterface { */ protected $isRenderingRoot = FALSE; - /** - * The request stack. - * - * @var \Symfony\Component\HttpFoundation\RequestStack - */ - protected $requestStack; - /** * The render context collection. * @@ -100,36 +57,34 @@ class Renderer implements RendererInterface { /** * Constructs a new Renderer. * - * @param \Drupal\Core\Utility\CallableResolver|\Drupal\Core\Controller\ControllerResolverInterface $callable_resolver + * @param \Drupal\Core\Utility\CallableResolver $callableResolver * The callable resolver. * @param \Drupal\Core\Theme\ThemeManagerInterface $theme * The theme manager. - * @param \Drupal\Core\Render\ElementInfoManagerInterface $element_info + * @param \Drupal\Core\Render\ElementInfoManagerInterface $elementInfo * The element info. - * @param \Drupal\Core\Render\PlaceholderGeneratorInterface $placeholder_generator + * @param \Drupal\Core\Render\PlaceholderGeneratorInterface $placeholderGenerator * The placeholder generator. - * @param \Drupal\Core\Render\RenderCacheInterface $render_cache + * @param \Drupal\Core\Render\RenderCacheInterface $renderCache * The render cache service. - * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack + * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack * The request stack. * @param array $renderer_config * The renderer configuration array. */ - public function __construct(ControllerResolverInterface|CallableResolver $callable_resolver, ThemeManagerInterface $theme, ElementInfoManagerInterface $element_info, PlaceholderGeneratorInterface $placeholder_generator, RenderCacheInterface $render_cache, RequestStack $request_stack, array $renderer_config) { - if ($callable_resolver instanceof ControllerResolverInterface) { - @trigger_error('Calling ' . __METHOD__ . '() with an argument of ControllerResolverInterface is deprecated in drupal:10.2.0 and is removed in drupal:11.0.0. Use \Drupal\Core\Utility\CallableResolver instead. See https://www.drupal.org/node/3369969', E_USER_DEPRECATED); - $callable_resolver = \Drupal::service('callable_resolver'); - } - $this->callableResolver = $callable_resolver; - $this->theme = $theme; - $this->elementInfo = $element_info; - $this->placeholderGenerator = $placeholder_generator; - $this->renderCache = $render_cache; + public function __construct( + protected CallableResolver $callableResolver, + protected ThemeManagerInterface $theme, + protected ElementInfoManagerInterface $elementInfo, + protected PlaceholderGeneratorInterface $placeholderGenerator, + protected RenderCacheInterface $renderCache, + protected RequestStack $requestStack, + array $renderer_config, + ) { if (!isset($renderer_config['debug'])) { $renderer_config['debug'] = FALSE; } $this->rendererConfig = $renderer_config; - $this->requestStack = $request_stack; // Initialize the context collection if needed. if (!isset(static::$contextCollection)) { diff --git a/core/tests/Drupal/Tests/Component/Render/FormattableMarkupTest.php b/core/tests/Drupal/Tests/Component/Render/FormattableMarkupTest.php index 06a50ebd5bc7972c188f650b190a057299fa0769..cb52f2f6952418779cead52505d5680093904950 100644 --- a/core/tests/Drupal/Tests/Component/Render/FormattableMarkupTest.php +++ b/core/tests/Drupal/Tests/Component/Render/FormattableMarkupTest.php @@ -54,29 +54,6 @@ public function testCount() { $this->assertEquals(strlen($string), $formattable_string->count()); } - /** - * @covers ::__toString - * @dataProvider providerTestNullPlaceholder - * @group legacy - */ - public function testNullPlaceholder(string $expected, string $string, array $arguments, string $expected_deprecation): void { - $this->expectDeprecation($expected_deprecation); - $this->assertEquals($expected, (string) new FormattableMarkup($string, $arguments)); - } - - /** - * Data provider for FormattableMarkupTest::testNullPlaceholder(). - * - * @return array - */ - public static function providerTestNullPlaceholder() { - return [ - ['', '@empty', ['@empty' => NULL], 'Deprecated NULL placeholder value for key (@empty) in: "@empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'], - ['', ':empty', [':empty' => NULL], 'Deprecated NULL placeholder value for key (:empty) in: ":empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'], - ['<em class="placeholder"></em>', '%empty', ['%empty' => NULL], 'Deprecated NULL placeholder value for key (%%empty) in: "%%empty". This will throw a PHP error in drupal:11.0.0. See https://www.drupal.org/node/3318826'], - ]; - } - /** * Custom error handler that saves the last error. *