Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
CRAP | |
0.00% |
0 / 26 |
| BookNavigationCacheContext | |
0.00% |
0 / 1 |
|
0.00% |
0 / 4 |
90 | |
0.00% |
0 / 26 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getLabel | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getContext | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 11 |
|||
| getCacheableMetadata | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 11 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\book\Cache\BookNavigationCacheContext. | |
| */ | |
| namespace Drupal\book\Cache; | |
| use Drupal\Core\Cache\CacheableMetadata; | |
| use Drupal\Core\Cache\Context\CacheContextInterface; | |
| use Symfony\Component\DependencyInjection\ContainerAware; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| /** | |
| * Defines the book navigation cache context service. | |
| * | |
| * Cache context ID: 'route.book_navigation'. | |
| * | |
| * This allows for book navigation location-aware caching. It depends on: | |
| * - whether the current route represents a book node at all | |
| * - and if so, where in the book hierarchy we are | |
| * | |
| * This class is container-aware to avoid initializing the 'book.manager' | |
| * service when it is not necessary. | |
| */ | |
| class BookNavigationCacheContext extends ContainerAware implements CacheContextInterface { | |
| /** | |
| * The request stack. | |
| * | |
| * @var \Symfony\Component\HttpFoundation\RequestStack | |
| */ | |
| protected $requestStack; | |
| /** | |
| * Constructs a new BookNavigationCacheContext service. | |
| * | |
| * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack | |
| * The request stack. | |
| */ | |
| public function __construct(RequestStack $request_stack) { | |
| $this->requestStack = $request_stack; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function getLabel() { | |
| return t("Book navigation"); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getContext() { | |
| // Find the current book's ID. | |
| $current_bid = 0; | |
| if ($node = $this->requestStack->getCurrentRequest()->get('node')) { | |
| $current_bid = empty($node->book['bid']) ? 0 : $node->book['bid']; | |
| } | |
| // If we're not looking at a book node, then we're not navigating a book. | |
| if ($current_bid === 0) { | |
| return 'book.none'; | |
| } | |
| // If we're looking at a book node, get the trail for that node. | |
| $active_trail = $this->container->get('book.manager') | |
| ->getActiveTrailIds($node->book['bid'], $node->book); | |
| return implode('|', $active_trail); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getCacheableMetadata() { | |
| // The book active trail depends on the node and data attached to it. | |
| // That information is however not stored as part of the node. | |
| $cacheable_metadata = new CacheableMetadata(); | |
| if ($node = $this->requestStack->getCurrentRequest()->get('node')) { | |
| // If the node is part of a book then we can use the cache tag for that | |
| // book. If not, then it can't be optimized away. | |
| if (!empty($node->book['bid'])) { | |
| $cacheable_metadata->addCacheTags(['bid:' . $node->book['bid']]); | |
| } | |
| else { | |
| $cacheable_metadata->setCacheMaxAge(0); | |
| } | |
| } | |
| return $cacheable_metadata; | |
| } | |
| } |