class ChainedPlaceholderStrategy

Same name in other branches
  1. 9 core/lib/Drupal/Core/Render/Placeholder/ChainedPlaceholderStrategy.php \Drupal\Core\Render\Placeholder\ChainedPlaceholderStrategy
  2. 10 core/lib/Drupal/Core/Render/Placeholder/ChainedPlaceholderStrategy.php \Drupal\Core\Render\Placeholder\ChainedPlaceholderStrategy
  3. 11.x core/lib/Drupal/Core/Render/Placeholder/ChainedPlaceholderStrategy.php \Drupal\Core\Render\Placeholder\ChainedPlaceholderStrategy

Renders placeholders using a chain of placeholder strategies.

Hierarchy

Expanded class hierarchy of ChainedPlaceholderStrategy

1 file declares its use of ChainedPlaceholderStrategy
ChainedPlaceholderStrategyTest.php in core/tests/Drupal/Tests/Core/Render/Placeholder/ChainedPlaceholderStrategyTest.php
1 string reference to 'ChainedPlaceholderStrategy'
core.services.yml in core/core.services.yml
core/core.services.yml
1 service uses ChainedPlaceholderStrategy
placeholder_strategy in core/core.services.yml
Drupal\Core\Render\Placeholder\ChainedPlaceholderStrategy

File

core/lib/Drupal/Core/Render/Placeholder/ChainedPlaceholderStrategy.php, line 8

Namespace

Drupal\Core\Render\Placeholder
View source
class ChainedPlaceholderStrategy implements PlaceholderStrategyInterface {
    
    /**
     * An ordered list of placeholder strategy services.
     *
     * Ordered according to service priority.
     *
     * @var \Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface[]
     */
    protected $placeholderStrategies = [];
    
    /**
     * Adds a placeholder strategy to use.
     *
     * @param \Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface $strategy
     *   The strategy to add to the placeholder strategies.
     */
    public function addPlaceholderStrategy(PlaceholderStrategyInterface $strategy) {
        $this->placeholderStrategies[] = $strategy;
    }
    
    /**
     * {@inheritdoc}
     */
    public function processPlaceholders(array $placeholders) {
        if (empty($placeholders)) {
            return [];
        }
        // Assert that there is at least one strategy.
        assert(!empty($this->placeholderStrategies), 'At least one placeholder strategy must be present; by default the fallback strategy \\Drupal\\Core\\Render\\Placeholder\\SingleFlushStrategy is always present.');
        $new_placeholders = [];
        // Give each placeholder strategy a chance to replace all not-yet replaced
        // placeholders. The order of placeholder strategies is well defined
        // and this uses a variation of the "chain of responsibility" design pattern.
        foreach ($this->placeholderStrategies as $strategy) {
            $processed_placeholders = $strategy->processPlaceholders($placeholders);
            assert(array_intersect_key($processed_placeholders, $placeholders) === $processed_placeholders, 'Processed placeholders must be a subset of all placeholders.');
            $placeholders = array_diff_key($placeholders, $processed_placeholders);
            $new_placeholders += $processed_placeholders;
            if (empty($placeholders)) {
                break;
            }
        }
        return $new_placeholders;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ChainedPlaceholderStrategy::$placeholderStrategies protected property An ordered list of placeholder strategy services.
ChainedPlaceholderStrategy::addPlaceholderStrategy public function Adds a placeholder strategy to use.
ChainedPlaceholderStrategy::processPlaceholders public function Processes placeholders to render them with different strategies. Overrides PlaceholderStrategyInterface::processPlaceholders

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.