Почему не сохраняются данные в кэш?

Главные вкладки

Аватар пользователя Joseph Joseph 30 марта 2022 в 16:58

Получаю 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->UAH2),
        ],
        
'usd' => [
          
'label' => $this->t('Dollar'),
          
'value' => round($data->rates->USD2),
        ],
        
'gbp' => [
          
'label' => $this->t('Pound sterling'),
          
'value' => round($data->rates->GBP2),
        ],
      ];

      

$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 нужно добавить?

ksm(\Drupal::cache()->get($cid)); показало:

Лучший ответ

Аватар пользователя Joseph Joseph 31 марта 2022 в 14:34

Основная проблема была в уровнях кэша. У меня получалось было два уровня кэша, кэш блока и свой собственный кэш который прописал в коде. Пофиксил проблему отключив кэш для блока, и теперь друпал цыпляется к тому кэшу, что нужно.

Комментарии

Аватар пользователя Joseph Joseph 31 марта 2022 в 14:34

Основная проблема была в уровнях кэша. У меня получалось было два уровня кэша, кэш блока и свой собственный кэш который прописал в коде. Пофиксил проблему отключив кэш для блока, и теперь друпал цыпляется к тому кэшу, что нужно.