Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
14 / 14 |
| ChainedPlaceholderStrategy | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
5 | |
100.00% |
14 / 14 |
| addPlaceholderStrategy | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| processPlaceholders | |
100.00% |
1 / 1 |
4 | |
100.00% |
12 / 12 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Render\Placeholder\ChainedPlaceholderStrategy. | |
| */ | |
| namespace Drupal\Core\Render\Placeholder; | |
| /** | |
| * Renders placeholders using a chain of placeholder strategies. | |
| */ | |
| 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; | |
| } | |
| } |