/** * {@inheritdoc} */ public function cacheGet($type) { if ($type != 'results') { return parent::cacheGet($type); } // Values to set: $view->result, $view->total_rows, $view->execute_time, // $view->current_page. if ($cache = \Drupal::cache($this->resultsBin)->get($this->generateResultsKey())) { $cutoff = $this->cacheExpire($type); if (!$cutoff || $cache->created > $cutoff) { $this->view->result = $cache->data['result']; $this->view->total_rows = $cache->data['total_rows']; $this->view->setCurrentPage($cache->data['current_page']); $this->view->execute_time = 0; // Trick Search API into believing a search happened, to make faceting // et al. work. /** @var \Drupal\search_api\Query\ResultSetInterface $results */ $results = $cache->data['search_api results']; /** @var \Drupal\search_api\Query\ResultsCacheInterface $static_results_cache */ $static_results_cache = \Drupal::service('search_api.results_static_cache'); $static_results_cache->addResults($results); try { $this->getQuery()->setSearchApiResults($results); $this->getQuery()->setSearchApiQuery($results->getQuery()); } catch (SearchApiException $e) { // Ignore. } return TRUE; } } return FALSE; }
/** * Constructs a TwigEnvironment object and stores cache and storage * internally. */ public function __construct(\Twig_LoaderInterface $loader = NULL, $options = array(), ModuleHandlerInterface $module_handler, ThemeHandlerInterface $theme_handler) { // @todo Pass as arguments from the DIC. $this->cache_object = \Drupal::cache(); // Ensure that twig.engine is loaded, given that it is needed to render a // template because functions like twig_drupal_escape_filter are called. require_once DRUPAL_ROOT . '/core/themes/engines/twig/twig.engine'; // Set twig path namespace for themes and modules. $namespaces = array(); foreach ($module_handler->getModuleList() as $name => $extension) { $namespaces[$name] = $extension->getPath(); } foreach ($theme_handler->listInfo() as $name => $extension) { $namespaces[$name] = $extension->getPath(); } foreach ($namespaces as $name => $path) { $templatesDirectory = $path . '/templates'; if (file_exists($templatesDirectory)) { $loader->addPath($templatesDirectory, $name); } } $this->templateClasses = array(); $this->stringLoader = new \Twig_Loader_String(); parent::__construct($loader, $options); }
/** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { drupal_set_message('Settings saved'); $this->configFactory()->getEditable('itk_instagram_hashtag.settings')->set('itk_instagram_hashtag.client_id', $form_state->getValue('client_id'))->set('itk_instagram_hashtag.resolution', $form_state->getValue('resolution'))->set('itk_instagram_hashtag.sort_by', $form_state->getValue('sort_by'))->set('itk_instagram_hashtag.limit', $form_state->getValue('limit'))->set('itk_instagram_hashtag.enable_caption', $form_state->getValue('enable_caption'))->save(); // Make sure the new settings are available to the js. \Drupal::cache('render')->deleteAll(); }
/** * Tests the path cache. */ function testPathCache() { // Create test node. $node1 = $this->drupalCreateNode(); // Create alias. $edit = array(); $edit['source'] = '/node/' . $node1->id(); $edit['alias'] = '/' . $this->randomMachineName(8); $this->drupalPostForm('admin/config/search/path/add', $edit, t('Save')); // Check the path alias whitelist cache. $whitelist = \Drupal::cache()->get('path_alias_whitelist'); $this->assertTrue($whitelist->data['node']); $this->assertFalse($whitelist->data['admin']); // Visit the system path for the node and confirm a cache entry is // created. \Drupal::cache('data')->deleteAll(); // Make sure the path is not converted to the alias. $this->drupalGet(trim($edit['source'], '/'), array('alias' => TRUE)); $this->assertTrue(\Drupal::cache('data')->get('preload-paths:' . $edit['source']), 'Cache entry was created.'); // Visit the alias for the node and confirm a cache entry is created. \Drupal::cache('data')->deleteAll(); // @todo Remove this once https://www.drupal.org/node/2480077 lands. Cache::invalidateTags(['rendered']); $this->drupalGet(trim($edit['alias'], '/')); $this->assertTrue(\Drupal::cache('data')->get('preload-paths:' . $edit['source']), 'Cache entry was created.'); }
/** * Tests the behavior of the theme registry class. */ function testRaceCondition() { // The theme registry is not marked as persistable in case we don't have a // proper request. \Drupal::request()->setMethod('GET'); $cid = 'test_theme_registry'; // Directly instantiate the theme registry, this will cause a base cache // entry to be written in __construct(). $cache = \Drupal::cache(); $lock_backend = \Drupal::lock(); $registry = new ThemeRegistry($cid, $cache, $lock_backend, array('theme_registry'), $this->container->get('module_handler')->isLoaded()); $this->assertTrue(\Drupal::cache()->get($cid), 'Cache entry was created.'); // Trigger a cache miss for an offset. $this->assertTrue($registry->get('theme_test_template_test'), 'Offset was returned correctly from the theme registry.'); // This will cause the ThemeRegistry class to write an updated version of // the cache entry when it is destroyed, usually at the end of the request. // Before that happens, manually delete the cache entry we created earlier // so that the new entry is written from scratch. \Drupal::cache()->delete($cid); // Destroy the class so that it triggers a cache write for the offset. $registry->destruct(); $this->assertTrue(\Drupal::cache()->get($cid), 'Cache entry was created.'); // Create a new instance of the class. Confirm that both the offset // requested previously, and one that has not yet been requested are both // available. $registry = new ThemeRegistry($cid, $cache, $lock_backend, array('theme_registry'), $this->container->get('module_handler')->isLoaded()); $this->assertTrue($registry->get('theme_test_template_test'), 'Offset was returned correctly from the theme registry'); $this->assertTrue($registry->get('theme_test_template_test_2'), 'Offset was returned correctly from the theme registry'); }
/** * Asserts page cache miss, then hit for the given URL; checks cache headers. * * @param \Drupal\Core\Url $url * The URL to test. * @param string[] $expected_contexts * The expected cache contexts for the given URL. * @param string[] $expected_tags * The expected cache tags for the given URL. */ protected function assertPageCacheContextsAndTags(Url $url, array $expected_contexts, array $expected_tags) { $absolute_url = $url->setAbsolute()->toString(); sort($expected_contexts); sort($expected_tags); // Assert cache miss + expected cache contexts + tags. $this->drupalGet($absolute_url); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS'); $this->assertCacheTags($expected_tags); $this->assertCacheContexts($expected_contexts); // Assert cache hit + expected cache contexts + tags. $this->drupalGet($absolute_url); $this->assertCacheTags($expected_tags); $this->assertCacheContexts($expected_contexts); // Assert page cache item + expected cache tags. $cid_parts = array($url->setAbsolute()->toString(), 'html'); $cid = implode(':', $cid_parts); $cache_entry = \Drupal::cache('render')->get($cid); sort($cache_entry->tags); $this->assertEqual($cache_entry->tags, $expected_tags); if ($cache_entry->tags !== $expected_tags) { debug('Missing cache tags: ' . implode(',', array_diff($cache_entry->tags, $expected_tags))); debug('Unwanted cache tags: ' . implode(',', array_diff($expected_tags, $cache_entry->tags))); } }
/** * Renders a form with a list of available database updates. */ function update_selection_page() { // Make sure there is no stale theme registry. \Drupal::cache()->deleteAll(); $build = \Drupal::formBuilder()->getForm('Drupal\\Core\\Update\\Form\\UpdateScriptSelectionForm'); $build['#title'] = 'Drupal database update'; return $build; }
/** * Asserts a view's result & render cache items' cache tags. * * This methods uses a full view object in order to render the view. * * @param \Drupal\views\ViewExecutable $view * The view to test, must have caching enabled. * @param null|string[] $expected_results_cache * NULL when expecting no results cache item, a set of cache tags expected * to be set on the results cache item otherwise. * @param bool $views_caching_is_enabled * Whether to expect an output cache item. If TRUE, the cache tags must * match those in $expected_render_array_cache_tags. * @param string[] $expected_render_array_cache_tags * A set of cache tags expected to be set on the built view's render array. * * @return array * The render array. */ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_cache, $views_caching_is_enabled, array $expected_render_array_cache_tags) { /** @var \Drupal\Core\Render\RendererInterface $renderer */ $renderer = \Drupal::service('renderer'); /** @var \Drupal\Core\Render\RenderCacheInterface $render_cache */ $render_cache = \Drupal::service('render_cache'); $build = $view->buildRenderable(); $original = $build; // Ensure the current request is a GET request so that render caching is // active for direct rendering of views, just like for actual requests. /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */ $request_stack = \Drupal::service('request_stack'); $request = new Request(); $request->server->set('REQUEST_TIME', REQUEST_TIME); $view->setRequest($request); $request_stack->push($request); $renderer->renderRoot($build); // Render array cache tags. $this->pass('Checking render array cache tags.'); sort($expected_render_array_cache_tags); $this->assertEqual($build['#cache']['tags'], $expected_render_array_cache_tags); $this->debugCacheTags($build['#cache']['tags'], $expected_render_array_cache_tags); if ($views_caching_is_enabled) { $this->pass('Checking Views results cache item cache tags.'); /** @var \Drupal\views\Plugin\views\cache\CachePluginBase $cache_plugin */ $cache_plugin = $view->display_handler->getPlugin('cache'); // Results cache. // Ensure that the views query is built. $view->build(); $results_cache_item = \Drupal::cache('data')->get($cache_plugin->generateResultsKey()); if (is_array($expected_results_cache)) { $this->assertTrue($results_cache_item, 'Results cache item found.'); if ($results_cache_item) { sort($expected_results_cache); $this->assertEqual($results_cache_item->tags, $expected_results_cache); $this->debugCacheTags($results_cache_item->tags, $expected_results_cache); } } else { $this->assertFalse($results_cache_item, 'Results cache item not found.'); } $this->pass('Checking Views render cache item cache tags.'); $original['#cache'] += ['contexts' => []]; $original['#cache']['contexts'] = Cache::mergeContexts($original['#cache']['contexts'], $this->container->getParameter('renderer.config')['required_cache_contexts']); $render_cache_item = $render_cache->get($original); if ($views_caching_is_enabled === TRUE) { $this->assertTrue(!empty($render_cache_item), 'Render cache item found.'); if ($render_cache_item) { $this->assertEqual($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags); $this->debugCacheTags($render_cache_item['#cache']['tags'], $expected_render_array_cache_tags); } } else { $this->assertFalse($render_cache_item, 'Render cache item not found.'); } } $view->destroy(); $request_stack->pop(); return $build; }
/** * Asserts that a cache entry has been removed. * * @param $message * Message to display. * @param $cid * The cache id. * @param $bin * The bin the cache item was stored in. */ function assertCacheRemoved($message, $cid = NULL, $bin = NULL) { if ($bin == NULL) { $bin = $this->defaultBin; } if ($cid == NULL) { $cid = $this->defaultCid; } $cached = \Drupal::cache($bin)->get($cid); $this->assertFalse($cached, $message); }
/** * Asserts page cache miss, then hit for the given URL; checks cache headers. * * @param \Drupal\Core\Url $url * The URL to test. * @param string[] $expected_contexts * The expected cache contexts for the given URL. * @param string[] $expected_tags * The expected cache tags for the given URL. */ protected function assertPageCacheContextsAndTags(Url $url, array $expected_contexts, array $expected_tags) { $absolute_url = $url->setAbsolute()->toString(); sort($expected_contexts); sort($expected_tags); $get_cache_header_values = function ($header_name) { $header_value = $this->drupalGetHeader($header_name); if (empty($header_value)) { return []; } else { return explode(' ', $header_value); } }; // Assert cache miss + expected cache contexts + tags. $this->drupalGet($absolute_url); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS'); $actual_contexts = $get_cache_header_values('X-Drupal-Cache-Contexts'); $actual_tags = $get_cache_header_values('X-Drupal-Cache-Tags'); $this->assertIdentical($actual_contexts, $expected_contexts); if ($actual_contexts !== $expected_contexts) { debug('Missing cache contexts: ' . implode(',', array_diff($actual_contexts, $expected_contexts))); debug('Unwanted cache contexts: ' . implode(',', array_diff($expected_contexts, $actual_contexts))); } $this->assertIdentical($actual_tags, $expected_tags); if ($actual_tags !== $expected_tags) { debug('Missing cache tags: ' . implode(',', array_diff($actual_tags, $expected_tags))); debug('Unwanted cache tags: ' . implode(',', array_diff($expected_tags, $actual_tags))); } // Assert cache hit + expected cache contexts + tags. $this->drupalGet($absolute_url); $actual_contexts = $get_cache_header_values('X-Drupal-Cache-Contexts'); $actual_tags = $get_cache_header_values('X-Drupal-Cache-Tags'); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT'); $this->assertIdentical($actual_contexts, $expected_contexts); if ($actual_contexts !== $expected_contexts) { debug('Missing cache contexts: ' . implode(',', array_diff($actual_contexts, $expected_contexts))); debug('Unwanted cache contexts: ' . implode(',', array_diff($expected_contexts, $actual_contexts))); } $this->assertIdentical($actual_tags, $expected_tags); if ($actual_tags !== $expected_tags) { debug('Missing cache tags: ' . implode(',', array_diff($actual_tags, $expected_tags))); debug('Unwanted cache tags: ' . implode(',', array_diff($expected_tags, $actual_tags))); } // Assert page cache item + expected cache tags. $cid_parts = array($url->setAbsolute()->toString(), 'html'); $cid = implode(':', $cid_parts); $cache_entry = \Drupal::cache('render')->get($cid); sort($cache_entry->tags); $this->assertEqual($cache_entry->tags, $expected_tags); if ($cache_entry->tags !== $expected_tags) { debug('Missing cache tags: ' . implode(',', array_diff($cache_entry->tags, $expected_tags))); debug('Unwanted cache tags: ' . implode(',', array_diff($expected_tags, $cache_entry->tags))); } }
/** * Tests that when creating a feed item, the feed tag is invalidated. */ public function testEntityCreation() { // Create a cache entry that is tagged with a feed cache tag. \Drupal::cache('render')->set('foo', 'bar', \Drupal\Core\Cache\CacheBackendInterface::CACHE_PERMANENT, $this->entity->getCacheTag()); // Verify a cache hit. $this->verifyRenderCache('foo', array('aggregator_feed:1')); // Now create a feed item in that feed. Item::create(array('fid' => $this->entity->getFeedId(), 'title' => t('Llama 2'), 'path' => 'https://groups.drupal.org/'))->save(); // Verify a cache miss. $this->assertFalse(\Drupal::cache('render')->get('foo'), 'Creating a new feed item invalidates the cache tag of the feed.'); }
/** * Get a list of cloudflare IP Ranges */ function cloudflare_ip_ranges() { if ($cache = \Drupal::cache()->get('cloudflare_ip_ranges')) { return $cache->data; } else { $ip_blocks = file_get_contents(CLOUDFLARE_URL_IPV4_RANGE); $cloudflare_ips = explode("\n", $ip_blocks); $cloudflare_ips = array_map('trim', $cloudflare_ips); \Drupal::cache()->set('cloudflare_ip_ranges', $cloudflare_ips, Cache::PERMANENT); return $cloudflare_ips; } }
/** * Tests that when creating a shortcut, the shortcut set tag is invalidated. */ public function testEntityCreation() { // Create a cache entry that is tagged with a shortcut set cache tag. $cache_tags = ['config:shortcut.set.default']; \Drupal::cache('render')->set('foo', 'bar', CacheBackendInterface::CACHE_PERMANENT, $cache_tags); // Verify a cache hit. $this->verifyRenderCache('foo', $cache_tags); // Now create a shortcut entity in that shortcut set. $this->createEntity(); // Verify a cache miss. $this->assertFalse(\Drupal::cache('render')->get('foo'), 'Creating a new shortcut invalidates the cache tag of the shortcut set.'); }
/** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $config = $this->config('medium.settings'); // Invalidate library cache if devmode has changed. $devmode = $form_state->getValue('devmode'); if ($config->get('devmode') != $devmode) { \Drupal::cache('discovery')->invalidate('library_info'); } // Save config $config->set('devmode', $devmode)->save(); parent::submitForm($form, $form_state); }
/** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { /* @var $item LanguageItem */ $item = $items[$delta]; $value = $item->value; // Add Languages to custom values: $this->options and $element[] $this->options = $languages = $item->getSettableOptions(); // Cache available languages for this field for a day. $field_name = $this->fieldDefinition->id(); \Drupal::cache('data')->set('languagefield:languages:' . $field_name, $languages, strtotime('+1 day', time())); $element['value'] = $element + array('#type' => 'textfield', '#default_value' => !empty($value) && isset($languages[$value]) ? $languages[$value] : '', '#languagefield_options' => $languages, '#autocomplete_route_name' => $this->getSetting('autocomplete_route_name'), '#autocomplete_route_parameters' => array('field_name' => $field_name), '#size' => $this->getSetting('size'), '#placeholder' => $this->getSetting('placeholder'), '#maxlength' => 255, '#element_validate' => array(array(get_class($this), 'validateElement'))); return $element; }
public function get_flickrimages($lat, $lon) { $cache = \Drupal::cache()->get($lat . $lon); if (isset($cache->data)) { return $cache->data; } $content = file_get_contents("https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5e1801b26daedd466cf264a797f25b74&lat=" . $lat . "&lon=" . $lon . "&radius=1&format=json"); $content = str_replace('jsonFlickrApi(', '', $content); $content = substr($content, 0, strlen($content) - 1); $result = json_decode($content); \Drupal::cache()->set($lat . $lon, $result, time() + 3600, array('flickrimages_cache')); return $result; }
public function get_weather($lat, $lon) { //if cache is available we return the cache result $cache = \Drupal::cache()->get($lat . $lon); if (isset($cache->data)) { return $cache->data; } $content = file_get_contents("http://api.openweathermap.org/data/2.5/weather?lat=" . $lat . "&lon=" . $lon . "&APPID=0b7f42c9896d550960889ce7122a06e7"); $result = json_decode($content); //We set the cache for one hour \Drupal::cache()->set($lat . $lon, $result, time() + 3600, array('html5weather_cache')); return $result; }
/** * Get matches for the autocompletion of languages. * * @param string $string * The string to match for languages. * @param $string $field_name * The name of the autocomplete field. * * @return array * An array containing the matching languages. */ public function getMatches($string, $field_name) { $matches = array(); if ($string) { $languages = \Drupal::cache('data')->get('languagefield:languages:' . $field_name)->data; foreach ($languages as $langcode => $language) { if (strpos(Unicode::strtolower($language), Unicode::strtolower($string)) !== FALSE) { $matches[] = array('value' => $language, 'label' => $language); } } } return $matches; }
/** * Verify that when loading a given page, it's a page cache hit or miss. * * @param string $path * The page at this path will be loaded. * @param string $hit_or_miss * 'HIT' if a page cache hit is expected, 'MISS' otherwise. * * @param array|FALSE $tags * When expecting a page cache hit, you may optionally specify an array of * expected cache tags. While FALSE, the cache tags will not be verified. */ protected function verifyPageCache($path, $hit_or_miss, $tags = FALSE) { $this->drupalGet($path); $message = String::format('Page cache @hit_or_miss for %path.', array('@hit_or_miss' => $hit_or_miss, '%path' => $path)); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), $hit_or_miss, $message); if ($hit_or_miss === 'HIT' && is_array($tags)) { $cid_parts = array(url($path, array('absolute' => TRUE)), 'html'); $cid = sha1(implode(':', $cid_parts)); $cache_entry = \Drupal::cache('render')->get($cid); sort($cache_entry->tags); sort($tags); $this->assertIdentical($cache_entry->tags, $tags); } }
/** * Constructs a TwigEnvironment object and stores cache and storage * internally. * * @param string $root * The app root. * @param \Twig_LoaderInterface $loader * The Twig loader or loader chain. * @param array $options * The options for the Twig environment. */ public function __construct($root, \Twig_LoaderInterface $loader = NULL, $options = array()) { // @todo Pass as arguments from the DIC. $this->cache_object = \Drupal::cache(); // Ensure that twig.engine is loaded, given that it is needed to render a // template because functions like TwigExtension::escapeFilter() are called. require_once $root . '/core/themes/engines/twig/twig.engine'; $this->templateClasses = array(); $options += array('cache' => TRUE, 'debug' => FALSE, 'auto_reload' => NULL); // Ensure autoescaping is always on. $options['autoescape'] = TRUE; $this->loader = $loader; parent::__construct($this->loader, $options); }
/** * Constructs a new \Drupal\bootstrap\Plugin\UpdateManager object. * * @param \Drupal\bootstrap\Theme $theme * The theme to use for discovery. */ public function __construct(Theme $theme) { // Unlike other plugins in this base theme, this one should only discover // update plugins that are unique to its own theme to avoid plugin ID // collision (e.g. base and sub-theme both implement an update plugin // with the id "8001"). $this->namespaces = new \ArrayObject(['Drupal\\' . $theme->getName() => [DRUPAL_ROOT . '/' . $theme->getPath() . '/src']]); $this->theme = $theme; $this->subdir = 'Plugin/Update'; $this->pluginDefinitionAnnotationName = 'Drupal\\bootstrap\\Annotation\\BootstrapUpdate'; $this->pluginInterface = 'Drupal\\bootstrap\\Plugin\\Update\\UpdateInterface'; $this->themeHandler = \Drupal::service('theme_handler'); $this->themeManager = \Drupal::service('theme.manager'); $this->setCacheBackend(\Drupal::cache('discovery'), 'theme:' . $theme->getName() . ':update', $this->getCacheTags()); }
/** * Ensures that Stable overrides all relevant core templates. */ public function testStableTemplateOverrides() { $registry = new Registry(\Drupal::root(), \Drupal::cache(), \Drupal::lock(), \Drupal::moduleHandler(), $this->themeHandler, \Drupal::service('theme.initialization'), 'stable'); $registry->setThemeManager(\Drupal::theme()); $registry_full = $registry->get(); foreach ($registry_full as $hook => $info) { if (isset($info['template'])) { // Allow skipping templates. if (in_array($info['template'], $this->templatesToSkip)) { continue; } $this->assertEquals('core/themes/stable', $info['theme path'], $info['template'] . '.html.twig overridden in Stable.'); } } }
/** * Verify that when loading a given page, it's a page cache hit or miss. * * @param \Drupal\Core\Url $url * The page for this URL will be loaded. * @param string $hit_or_miss * 'HIT' if a page cache hit is expected, 'MISS' otherwise. * * @param array|FALSE $tags * When expecting a page cache hit, you may optionally specify an array of * expected cache tags. While FALSE, the cache tags will not be verified. */ protected function verifyPageCache(Url $url, $hit_or_miss, $tags = FALSE) { $this->drupalGet($url); $message = String::format('Page cache @hit_or_miss for %path.', array('@hit_or_miss' => $hit_or_miss, '%path' => $url->toString())); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), $hit_or_miss, $message); if ($hit_or_miss === 'HIT' && is_array($tags)) { $absolute_url = $url->setAbsolute()->toString(); $cid_parts = array($absolute_url, 'html'); $cid = implode(':', $cid_parts); $cache_entry = \Drupal::cache('render')->get($cid); sort($cache_entry->tags); $tags = array_unique($tags); sort($tags); $this->assertIdentical($cache_entry->tags, $tags); } }
public function cache($date, $days_to_fore, $hourly_interval, $location) { $data = []; for ($x = 0; $x <= $days_to_fore; $x++) { $newdate = strtotime('+' . $x . ' day', strtotime($date)); $newdate = date('Y-m-j', $newdate); $CACHE_ID = md5($newdate . $location . $hourly_interval); if ($cache = \Drupal::cache()->get($CACHE_ID)) { $data[] = $cache->data; } else { $data[] = $this->response($newdate, $location, $hourly_interval); \Drupal::cache()->set($CACHE_ID, $data); } } return array($data); }
/** * {@inheritdoc} */ public function LayoutConfig($type) { $config_data = array(); if ($cache = \Drupal::cache()->get($this->layout_cid . ':' . $type)) { $config_data = $cache->data; } else { $config_file = $this->layout_path . '/' . $this->layout_name . '.' . $type . '.yml'; if (file_exists($config_file)) { $parser = new Parser(); $config_data = $parser->parse(file_get_contents($config_file)); } if (!empty($config_data)) { \Drupal::cache()->set($this->layout_cid . ':' . $type, $config_data); } } return $config_data; }
/** * Tests the output caching on an actual page. */ public function testCacheOutputOnPage() { $view = Views::getView('test_display'); $view->storage->setStatus(TRUE); $view->setDisplay('page_1'); $view->display_handler->overrideOption('cache', array('type' => 'time', 'options' => array('results_lifespan' => '3600', 'output_lifespan' => '3600'))); $view->save(); $this->container->get('router.builder')->rebuildIfNeeded(); $output_key = $view->getDisplay()->getPlugin('cache')->generateOutputKey(); $this->assertFalse(\Drupal::cache('render')->get($output_key)); $this->drupalGet('test-display'); $this->assertResponse(200); $this->assertTrue(\Drupal::cache('render')->get($output_key)); $this->drupalGet('test-display'); $this->assertResponse(200); $this->assertTrue(\Drupal::cache('render')->get($output_key)); }
/** * @param string[] $toBeAdded * @param string[] $toBeRemoved * * @return string[] */ protected function updateClassFiles($toBeAdded, $toBeRemoved) { $class_files = $toBeAdded; // Other requests may have already written to the cache, so we get an up to // date version. $cached = \Drupal::cache()->get($this->cacheName); if (isset($cached->data)) { $class_files += $cached->data; foreach ($toBeRemoved as $class => $file) { if (isset($class_files[$class]) && $class_files[$class] === $file) { unset($class_files[$class]); } } } \Drupal::cache()->set($this->cacheName, $class_files); return $class_files; }
/** * Asserts a view's result & output cache items' cache tags. * * @param \Drupal\views\ViewExecutable $view * The view to test, must have caching enabled. * @param null|string[] $expected_results_cache * NULL when expecting no results cache item, a set of cache tags expected * to be set on the results cache item otherwise. * @param bool $views_caching_is_enabled * Whether to expect an output cache item. If TRUE, the cache tags must * match those in $expected_render_array_cache_tags. * @param string[] $expected_render_array_cache_tags * A set of cache tags expected to be set on the built view's render array. * * @return array * The render array */ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_cache, $views_caching_is_enabled, array $expected_render_array_cache_tags) { $build = $view->preview(); // Ensure the current request is a GET request so that render caching is // active for direct rendering of views, just like for actual requests. /** @var \Symfony\Component\HttpFoundation\RequestStack $request_stack */ $request_stack = \Drupal::service('request_stack'); $request_stack->push(new Request()); \Drupal::service('renderer')->renderRoot($build); $request_stack->pop(); // Render array cache tags. $this->pass('Checking render array cache tags.'); sort($expected_render_array_cache_tags); $this->assertEqual($build['#cache']['tags'], $expected_render_array_cache_tags); if ($views_caching_is_enabled) { $this->pass('Checking Views results cache item cache tags.'); /** @var \Drupal\views\Plugin\views\cache\CachePluginBase $cache_plugin */ $cache_plugin = $view->display_handler->getPlugin('cache'); // Results cache. $results_cache_item = \Drupal::cache('data')->get($cache_plugin->generateResultsKey()); if (is_array($expected_results_cache)) { $this->assertTrue($results_cache_item, 'Results cache item found.'); if ($results_cache_item) { sort($expected_results_cache); $this->assertEqual($results_cache_item->tags, $expected_results_cache); } } else { $this->assertFalse($results_cache_item, 'Results cache item not found.'); } // Output cache. $this->pass('Checking Views output cache item cache tags.'); $output_cache_item = \Drupal::cache('render')->get($cache_plugin->generateOutputKey()); if ($views_caching_is_enabled === TRUE) { $this->assertTrue($output_cache_item, 'Output cache item found.'); if ($output_cache_item) { $this->assertEqual($output_cache_item->tags, Cache::mergeTags($expected_render_array_cache_tags, ['rendered'])); } } else { $this->assertFalse($output_cache_item, 'Output cache item not found.'); } } $view->destroy(); return $build; }
/** * Fills page cache for the given path, verify cache tags on page cache hit. * * @param $path * The Drupal page path to test. * @param $expected_tags * The expected cache tags for the page cache entry of the given $path. */ protected function verifyPageCacheTags($path, $expected_tags) { sort($expected_tags); $this->drupalGet($path); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS'); $actual_tags = explode(' ', $this->drupalGetHeader('X-Drupal-Cache-Tags')); sort($actual_tags); $this->assertIdentical($actual_tags, $expected_tags); $this->drupalGet($path); $actual_tags = explode(' ', $this->drupalGetHeader('X-Drupal-Cache-Tags')); sort($actual_tags); $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT'); $this->assertIdentical($actual_tags, $expected_tags); $cid_parts = array(url($path, array('absolute' => TRUE)), 'html'); $cid = sha1(implode(':', $cid_parts)); $cache_entry = \Drupal::cache('render')->get($cid); sort($cache_entry->tags); $this->assertEqual($cache_entry->tags, $expected_tags); }
/** * Tests entity render cache handling. */ public function testEntityViewBuilderCache() { /** @var \Drupal\Core\Render\RendererInterface $renderer */ $renderer = $this->container->get('renderer'); $cache_contexts_manager = \Drupal::service("cache_contexts_manager"); $cache = \Drupal::cache(); // Force a request via GET so we can get drupal_render() cache working. $request = \Drupal::request(); $request_method = $request->server->get('REQUEST_METHOD'); $request->setMethod('GET'); $entity_test = $this->createTestEntity('entity_test'); // Test that new entities (before they are saved for the first time) do not // generate a cache entry. $build = $this->container->get('entity.manager')->getViewBuilder('entity_test')->view($entity_test, 'full'); $this->assertTrue(isset($build['#cache']) && array_keys($build['#cache']) == ['tags', 'contexts', 'max-age'], 'The render array element of new (unsaved) entities is not cached, but does have cache tags set.'); // Get a fully built entity view render array. $entity_test->save(); $build = $this->container->get('entity.manager')->getViewBuilder('entity_test')->view($entity_test, 'full'); $cid_parts = array_merge($build['#cache']['keys'], $cache_contexts_manager->convertTokensToKeys(['languages:' . LanguageInterface::TYPE_INTERFACE, 'theme', 'user.permissions'])->getKeys()); $cid = implode(':', $cid_parts); $bin = $build['#cache']['bin']; // Mock the build array to not require the theme registry. unset($build['#theme']); $build['#markup'] = 'entity_render_test'; // Test that a cache entry is created. $renderer->renderRoot($build); $this->assertTrue($this->container->get('cache.' . $bin)->get($cid), 'The entity render element has been cached.'); // Re-save the entity and check that the cache entry has been deleted. $cache->set('kittens', 'Kitten data', Cache::PERMANENT, $build['#cache']['tags']); $entity_test->save(); $this->assertFalse($this->container->get('cache.' . $bin)->get($cid), 'The entity render cache has been cleared when the entity was saved.'); $this->assertFalse($cache->get('kittens'), 'The entity saving has invalidated cache tags.'); // Rebuild the render array (creating a new cache entry in the process) and // delete the entity to check the cache entry is deleted. unset($build['#printed']); $renderer->renderRoot($build); $this->assertTrue($this->container->get('cache.' . $bin)->get($cid), 'The entity render element has been cached.'); $entity_test->delete(); $this->assertFalse($this->container->get('cache.' . $bin)->get($cid), 'The entity render cache has been cleared when the entity was deleted.'); // Restore the previous request method. $request->setMethod($request_method); }