【发布时间】:2017-02-14 23:47:04
【问题描述】:
在 Drupal 7 中,您可以通过执行以下操作来创建自定义缓存表:
$schema['custom_table'] = drupal_get_schema_unprocessed('system','cache');
由于该功能在 Drupal 8 中已被弃用,请您帮我找到等效的功能吗?
【问题讨论】:
标签: drupal drupal-modules drupal-8
在 Drupal 7 中,您可以通过执行以下操作来创建自定义缓存表:
$schema['custom_table'] = drupal_get_schema_unprocessed('system','cache');
由于该功能在 Drupal 8 中已被弃用,请您帮我找到等效的功能吗?
【问题讨论】:
标签: drupal drupal-modules drupal-8
在 Drupal 8 中,Cache API 提供了多个 cache backend。缓存被分成不同的“缓存箱”。如果是DatabaseBackend,不同的bin会有不同的table。但是如何实现您的缓存箱取决于后端。
因此,您不会像在 Drupal 7 中那样直接与数据库表交互。您需要调用 Drupal 8 核心提供的 CacheBackendInterface 实现。
假设您要创建一个模块mymodule,并带有一个自定义缓存箱mycache。您应该使用自定义 bin 名称定义自定义模块对 CacheBackendInterface 的依赖关系。
在您的mymodule.services.yml 文件中,应该有这样的部分:
cache.mycache:
class: Drupal\Core\Cache\CacheBackendInterface
tags:
- { name: cache.bin }
factory: cache_factory:get
arguments: [mycache]
然后通过安装模块,对缓存箱的依赖将传递给CacheBackendInterface 实现。将创建请求的缓存箱。
然后你可以像这样使用你的自定义缓存箱:
<?php
$data = NULL;
if ($cache = \Drupal::cache('mycache')->get($cid)) {
$data = $cache->data;
}
else {
$data = mymodule_complicated_calculation();
\Drupal::cache('mycache')->set($cid, $data);
}
?>
如果你想强制你的缓存使用数据库,你可以将这个添加到你的设置文件中:
$settings['cache']['bins']['mycache'] = 'cache.backend.database';
好的。如果你坚持要获取 DatabaseBackend 的原始 schema,你应该从 Drupal\Core\CacheDatabaseBackend 的公共方法 schemaDefinition() 中获取。
你可以这样称呼它:
<?php
$schema = \Drupal::cache()->schemaDefinition();
?>
【讨论】: