Получаю json данные с курсами валют и отображаю их на странице. Но надо эти данные хранить в кэше.
Закомментировал код, который добавил, чтобы хранить данные в кэше:
<?php
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Render\Markup;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use Drupal\Core\Cache\CacheBackendInterface; // эта строка
/**
* Provides a block with Exchange Rates.
*
* @block(
* id = "block_exchange_rates",
* admin_label = @Translation("Exchange rates block"),
* )
*
*/
class ExchangeRatesBlock extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
$client = \Drupal::httpClient();
$config = \Drupal::config('exchange.settings');
$acesss_key = $config->get('exchange_access_key');
$cid = 'sydneypro_exchange_rates_block:cacheData'; // эта строка
$data_cached = NULL; // эта строка
try {
if ($cache = \Drupal::cache()->get($cid)) { // эта строка
$data_cached = $cache->data; // эта строка
}
else {
$response = $client->get('http://api.exchangeratesapi.io/v1/latest?access_key=' . $acesss_key);
$response_data = $response->getBody();
$data = json_decode($response_data);
\Drupal::cache()->set($cid, $data_cached); // эта строка
}
$properties = [
'uah' => [
'label' => $this->t('Hryvnia'),
'value' => round($data->rates->UAH, 2),
],
'usd' => [
'label' => $this->t('Dollar'),
'value' => round($data->rates->USD, 2),
],
'gbp' => [
'label' => $this->t('Pound sterling'),
'value' => round($data->rates->GBP, 2),
],
];
$build = [];
foreach (
$properties as $exchange_property => $data) {
$build[$exchange_property] = ['#type' => 'container'];
$build[$exchange_property]['label'] = ['#markup' => $data['label']];
$build[$exchange_property]['separator'] = ['#markup' => ': '];
$build[$exchange_property]['value'] = ['#markup' => $data['value']];
}
$build[] = [
'#attached' => [
'library' => [
'sydneypro_exchange_rates_block/sydneypro_exchange_rates_block',
],
],
];
return
$build;
}
catch (ConnectException $e) {
return [
'#markup' => Markup::create('<h1>Internet, DNS, or other connection error</h1>'),
];
}
catch (RequestException $e) {
return [
'#markup' => Markup::create('<h1>Sorry, no data available</h1>'),
];
}
}
}
?>
use Drupal\Core\Cache\CacheBackendInterface; и переменная $data_cached подсвечиваются серым цветом и в подсказке пишет что они не используются.
В панели разработчика в Cache storage их нет. Также я пробовал достать функцией ksm() модуля devel kint extras но ничего не отобразилось, есть подозрения что как-то неправильно использовал Cache API.
Возможно я какую-то ошибку допустил или что-то не дописал в коде, без чего не будут сохраняться данные в кэш? Может какой-то dependency injection нужно добавить?
Комментарии
\Drupal::cache()->set($cid, $data_cached);
ничего странного не видите?
Основная проблема была в уровнях кэша. У меня получалось было два уровня кэша, кэш блока и свой собственный кэш который прописал в коде. Пофиксил проблему отключив кэш для блока, и теперь друпал цыпляется к тому кэшу, что нужно.