MenuLinkContentVisibilityCache.php in Custom Menu Links Visibility 8
File
src/MenuLinkContentVisibilityCache.php
View source
<?php
namespace Drupal\menu_link_content_visibility;
use Drupal\Component\Plugin\Exception\ContextException;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Condition\ConditionInterface;
use Drupal\Core\Condition\ConditionManager;
use Drupal\Core\Plugin\Context\ContextHandler;
use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
use Drupal\Core\Plugin\ContextAwarePluginInterface;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Symfony\Component\DependencyInjection\ContainerInterface;
class MenuLinkContentVisibilityCache {
public static function createFromID(ContainerInterface $container, $id) {
$entity_manager = $container
->get('entity.manager');
$menu_link_content = $entity_manager
->getStorage('menu_link_content')
->load($id);
return new self($menu_link_content, $container
->get('plugin.manager.condition'), $container
->get('context.repository'), $container
->get('context.handler'));
}
private $condition_manager;
private $context_repository;
private $context_handler;
private $menu_link_content;
private $conditions;
private function __construct($menu_link_content, ConditionManager $condition_manager, ContextRepositoryInterface $context_repository, ContextHandler $context_handler) {
$this->menu_link_content = $menu_link_content;
$this->condition_manager = $condition_manager;
$this->context_repository = $context_repository;
$this->context_handler = $context_handler;
$this->conditions = $this
->buildConditions();
}
public function getCacheContexts() {
$cache_contexts = [];
foreach ($this->conditions as $condition) {
$cache_contexts = Cache::mergeContexts($cache_contexts, $condition
->getCacheContexts());
}
return $cache_contexts;
}
public function getCacheTags() {
$cache_tags = [];
foreach ($this->conditions as $condition) {
$cache_tags = Cache::mergeTags($cache_tags, $condition
->getCacheTags());
}
return $cache_tags;
}
public function getCacheMaxAge() {
$cache_max_age = Cache::PERMANENT;
foreach ($this->conditions as $condition) {
$cache_max_age = Cache::mergeMaxAges($cache_max_age, $condition
->getCacheMaxAge());
}
return $cache_max_age;
}
private function buildConditions() {
$conditions = [];
if ($visibility = unserialize($this->menu_link_content
->get('visibility')->value)) {
foreach ($visibility as $condition_id => $condition_configuration) {
$condition = $this->condition_manager
->createInstance($condition_id, $condition_configuration);
if ($condition instanceof ContextAwarePluginInterface) {
$contexts = $this->context_repository
->getRuntimeContexts(array_values($condition
->getContextMapping()));
try {
$this->context_handler
->applyContextMapping($condition, $contexts);
} catch (ContextException $e) {
}
}
$conditions[$condition_id] = $condition;
}
}
return $conditions;
}
}