Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
CRAP | |
89.29% |
25 / 28 |
LazyContextRepository | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
11.15 | |
89.29% |
25 / 28 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getRuntimeContexts | |
100.00% |
1 / 1 |
7 | |
100.00% |
18 / 18 |
|||
getAvailableContexts | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Plugin\Context\LazyContextRepository. | |
*/ | |
namespace Drupal\Core\Plugin\Context; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
/** | |
* Provides a context repository which uses context provider services. | |
*/ | |
class LazyContextRepository implements ContextRepositoryInterface { | |
/** | |
* The set of available context providers service IDs. | |
* | |
* @var string[] | |
* Context provider service IDs. | |
*/ | |
protected $contextProviderServiceIDs = []; | |
/** | |
* The service container. | |
* | |
* @var \Symfony\Component\DependencyInjection\ContainerInterface | |
*/ | |
protected $container; | |
/** | |
* The statically cached contexts. | |
* | |
* @var \Drupal\Core\Plugin\Context\ContextInterface[] | |
*/ | |
protected $contexts = []; | |
/** | |
* Constructs a LazyContextRepository object. | |
* | |
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container | |
* The current service container. | |
* @param string[] $context_provider_service_ids | |
* The set of the available context provider service IDs. | |
*/ | |
public function __construct(ContainerInterface $container, array $context_provider_service_ids) { | |
$this->container = $container; | |
$this->contextProviderServiceIDs = $context_provider_service_ids; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getRuntimeContexts(array $context_ids) { | |
$contexts = []; | |
// Create a map of context providers (service IDs) to unqualified context | |
// IDs. | |
$context_ids_by_service = []; | |
foreach ($context_ids as $id) { | |
if (isset($this->contexts[$id])) { | |
$contexts[$id] = $this->contexts[$id]; | |
continue; | |
} | |
// The IDs have been passed in @{service_id}:{unqualified_context_id} | |
// format. | |
// @todo Convert to an assert once https://www.drupal.org/node/2408013 is | |
// in. | |
if ($id[0] === '@' && strpos($id, ':') !== FALSE) { | |
list($service_id, $unqualified_context_id) = explode(':', $id, 2); | |
// Remove the leading '@'. | |
$service_id = substr($service_id, 1); | |
} | |
else { | |
throw new \InvalidArgumentException('You must provide the context IDs in the @{service_id}:{unqualified_context_id} format.'); | |
} | |
$context_ids_by_service[$service_id][] = $unqualified_context_id; | |
} | |
// Iterate over all missing context providers (services), gather the | |
// runtime contexts and assign them as requested. | |
foreach ($context_ids_by_service as $service_id => $unqualified_context_ids) { | |
$contexts_by_service = $this->container->get($service_id)->getRuntimeContexts($unqualified_context_ids); | |
$wanted_contexts = array_intersect_key($contexts_by_service, array_flip($unqualified_context_ids)); | |
foreach ($wanted_contexts as $unqualified_context_id => $context) { | |
$context_id = '@' . $service_id . ':' . $unqualified_context_id; | |
$this->contexts[$context_id] = $contexts[$context_id] = $context; | |
} | |
} | |
return $contexts; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getAvailableContexts() { | |
$contexts = []; | |
foreach ($this->contextProviderServiceIDs as $service_id) { | |
$contexts_by_service = $this->container->get($service_id)->getAvailableContexts(); | |
foreach ($contexts_by_service as $unqualified_context_id => $context) { | |
$context_id = '@' . $service_id . ':' . $unqualified_context_id; | |
$contexts[$context_id] = $context; | |
} | |
} | |
return $contexts; | |
} | |
} |