diff --git a/classes/observer/BaseObserver.php b/classes/observer/BaseObserver.php index 515de4b..3b0bd3b 100644 --- a/classes/observer/BaseObserver.php +++ b/classes/observer/BaseObserver.php @@ -1,26 +1,80 @@ getKey() : null, + [], + true + ) + )->flush(); + } + /** - * Очистка кэша - * @return void + * @param int|Collection|array|null $identifiers + * @param array|null $additionalPieces + * @param bool $excludeBaseClassNameTagWithoutIdentifiers + * @desc $excludeBaseClassNameTagWithoutIdentifiers - выключает из результирующего массива тег кеша только с базовым классом, если переданы идентификаторы + * @desc То есть в итоговой выборке - не будет тега, без идентификатора, если вообще идентификаторы переданы + * @return array */ - public static function clearCache(): void + public static function getCacheTag($identifiers = null, ?array $additionalPieces = [], bool $excludeBaseClassNameTagWithoutIdentifiers = false): array { - $tags = [self::getCacheTag()]; + return static::getCacheTagsWithMaybeIdentifiers(static::getClass(), $identifiers, $additionalPieces, $excludeBaseClassNameTagWithoutIdentifiers); + } - \Cache::tags($tags)->flush(); + public static function formatCacheTag(array $pieces): string + { + return implode('.', $pieces); } /** - * Получение тэка кеша - * @return string + * @param int|Collection|array|null $value + * @return array */ - public static function getCacheTag(): string + private static function forceArray($value = null): array { - return static::getClass(); + return $value instanceof Collection ? $value->toArray() : (array)$value; + } + + /** + * @param string $baseClassName + * @param int|Collection|array|null $iterateIdentifiers + * @param array|null $additionalTagPieces + * @param bool $excludeBaseClassNameTagWithoutIdentifiers + * @return array + */ + private static function getCacheTagsWithMaybeIdentifiers(string $baseClassName, $iterateIdentifiers = [], ?array $additionalTagPieces = [], bool $excludeBaseClassNameTagWithoutIdentifiers = false): array + { + $iterateIdentifiers = static::forceArray($iterateIdentifiers); + + $cacheTags = []; + + if (!$excludeBaseClassNameTagWithoutIdentifiers || !$iterateIdentifiers) { + $cacheTags = (array)static::formatCacheTag(array_merge([$baseClassName], $additionalTagPieces)); + } + + if ($iterateIdentifiers) { + $cacheTags = array_merge( + $cacheTags, + array_map( + fn ($identifier) => static::formatCacheTag( + array_merge([$baseClassName, $identifier], $additionalTagPieces) + ), + $iterateIdentifiers + ) + ); + } + + return $cacheTags; } }