Upgraded drupal core with security updates
[yaffs-website] / web / core / lib / Drupal / Core / Cache / Cache.php
1 <?php
2
3 namespace Drupal\Core\Cache;
4
5 use Drupal\Core\Database\Query\SelectInterface;
6
7 /**
8  * Helper methods for cache.
9  *
10  * @ingroup cache
11  */
12 class Cache {
13
14   /**
15    * Indicates that the item should never be removed unless explicitly deleted.
16    */
17   const PERMANENT = CacheBackendInterface::CACHE_PERMANENT;
18
19   /**
20    * Merges arrays of cache contexts and removes duplicates.
21    *
22    * @param array $a
23    *    Cache contexts array to merge.
24    * @param array $b
25    *    Cache contexts array to merge.
26    *
27    * @return string[]
28    *   The merged array of cache contexts.
29    */
30   public static function mergeContexts(array $a = [], array $b = []) {
31     $cache_contexts = array_unique(array_merge($a, $b));
32     assert('\Drupal::service(\'cache_contexts_manager\')->assertValidTokens($cache_contexts)');
33     sort($cache_contexts);
34     return $cache_contexts;
35   }
36
37   /**
38    * Merges arrays of cache tags and removes duplicates.
39    *
40    * The cache tags array is returned in a format that is valid for
41    * \Drupal\Core\Cache\CacheBackendInterface::set().
42    *
43    * When caching elements, it is necessary to collect all cache tags into a
44    * single array, from both the element itself and all child elements. This
45    * allows items to be invalidated based on all tags attached to the content
46    * they're constituted from.
47    *
48    * @param array $a
49    *    Cache tags array to merge.
50    * @param array $b
51    *    Cache tags array to merge.
52    *
53    * @return string[]
54    *   The merged array of cache tags.
55    */
56   public static function mergeTags(array $a = [], array $b = []) {
57     assert('\Drupal\Component\Assertion\Inspector::assertAllStrings($a) && \Drupal\Component\Assertion\Inspector::assertAllStrings($b)', 'Cache tags must be valid strings');
58
59     $cache_tags = array_unique(array_merge($a, $b));
60     sort($cache_tags);
61     return $cache_tags;
62   }
63
64   /**
65    * Merges max-age values (expressed in seconds), finds the lowest max-age.
66    *
67    * Ensures infinite max-age (Cache::PERMANENT) is taken into account.
68    *
69    * @param int $a
70    *    Max age value to merge.
71    * @param int $b
72    *    Max age value to merge.
73    *
74    * @return int
75    *   The minimum max-age value.
76    */
77   public static function mergeMaxAges($a = Cache::PERMANENT, $b = Cache::PERMANENT) {
78     // If one of the values is Cache::PERMANENT, return the other value.
79     if ($a === Cache::PERMANENT) {
80       return $b;
81     }
82     if ($b === Cache::PERMANENT) {
83       return $a;
84     }
85
86     // If none or the values are Cache::PERMANENT, return the minimum value.
87     return min($a, $b);
88   }
89
90   /**
91    * Validates an array of cache tags.
92    *
93    * Can be called before using cache tags in operations, to ensure validity.
94    *
95    * @param string[] $tags
96    *   An array of cache tags.
97    *
98    * @deprecated
99    *   Use assert('\Drupal\Component\Assertion\Inspector::assertAllStrings($tags)');
100    *
101    * @throws \LogicException
102    */
103   public static function validateTags(array $tags) {
104     if (empty($tags)) {
105       return;
106     }
107     foreach ($tags as $value) {
108       if (!is_string($value)) {
109         throw new \LogicException('Cache tags must be strings, ' . gettype($value) . ' given.');
110       }
111     }
112   }
113
114   /**
115    * Build an array of cache tags from a given prefix and an array of suffixes.
116    *
117    * Each suffix will be converted to a cache tag by appending it to the prefix,
118    * with a colon between them.
119    *
120    * @param string $prefix
121    *   A prefix string.
122    * @param array $suffixes
123    *   An array of suffixes. Will be cast to strings.
124    * @param string $glue
125    *   A string to be used as glue for concatenation. Defaults to a colon.
126    *
127    * @return string[]
128    *   An array of cache tags.
129    */
130   public static function buildTags($prefix, array $suffixes, $glue = ':') {
131     $tags = [];
132     foreach ($suffixes as $suffix) {
133       $tags[] = $prefix . $glue . $suffix;
134     }
135     return $tags;
136   }
137
138   /**
139    * Marks cache items from all bins with any of the specified tags as invalid.
140    *
141    * @param string[] $tags
142    *   The list of tags to invalidate cache items for.
143    */
144   public static function invalidateTags(array $tags) {
145     \Drupal::service('cache_tags.invalidator')->invalidateTags($tags);
146   }
147
148   /**
149    * Gets all cache bin services.
150    *
151    * @return \Drupal\Core\Cache\CacheBackendInterface[]
152    *   An array of cache backend objects keyed by cache bins.
153    */
154   public static function getBins() {
155     $bins = [];
156     $container = \Drupal::getContainer();
157     foreach ($container->getParameter('cache_bins') as $service_id => $bin) {
158       $bins[$bin] = $container->get($service_id);
159     }
160     return $bins;
161   }
162
163   /**
164    * Generates a hash from a query object, to be used as part of the cache key.
165    *
166    * This smart caching strategy saves Drupal from querying and rendering to
167    * HTML when the underlying query is unchanged.
168    *
169    * Expensive queries should use the query builder to create the query and then
170    * call this function. Executing the query and formatting results should
171    * happen in a #pre_render callback.
172    *
173    * @param \Drupal\Core\Database\Query\SelectInterface $query
174    *   A select query object.
175    *
176    * @return string
177    *   A hash of the query arguments.
178    */
179   public static function keyFromQuery(SelectInterface $query) {
180     $query->preExecute();
181     $keys = [(string) $query, $query->getArguments()];
182     return hash('sha256', serialize($keys));
183   }
184
185 }