Revalidator

了解如何实现自定义 revalidator 插件。


为了处理 按需重新验证,我们使用 Revalidator 插件。

一个 Revalidator 插件会在 Drupal 实体被 **插入**、**更新** 或 **删除** 时重新验证一个或多个 Next.js 站点。

默认情况下,next 模块附带 Path 重验证器。 Path 重验证器根据实体路径重新验证 Next.js 站点。


自定义重验证器

您可以使用 Drupal 插件 API 实现自己的重验证器插件。

custom_module/src/Plugin/Next/Revalidator/CustomRevalidator.php

<?php
namespace Drupal\custom_module\Plugin\Next\Revalidator;
use Drupal\next\Event\EntityActionEvent;
use Drupal\next\Plugin\RevalidatorBase;
/**
* Provides a custom revalidator.
*
* @Revalidator(
* id = "custom",
* label = "Custom Revalidator",
* description = "Description for the custom revalidator"
* )
*/
class CustomRevalidator extends RevalidatorBase {
/**
* {@inheritdoc}
*/
public function revalidate(EntityActionEvent $event): bool {
// Get the entity.
$entity = $event->getEntity();
// Get the sites configured for this entity.
$sites = $event->getSites();
// Get the action: insert, updated or delete.
$action = $event->getAction();
}
}

访问实体类型的配置页面,网址为 /admin/config/services/next/entity-types

您应该看到在按需重验证下有一个名为 **Custom Revalidator** 的插件。 选择它并保存。

现在,每当插入、更新或删除实体时,都会调用 CustomRevalidator::revalidate 函数。

**注意:** revalidate关闭 时调用。 这意味着 dump() 调用不会被注册。 请改为使用断点。


可配置重验证器

要实现可配置的 Revalidator 插件,请扩展 ConfigurableRevalidatorBase

custom_module/src/Plugin/Next/Revalidator/ConfigurableRevalidator.php

<?php
namespace Drupal\custom_module\Plugin\Next\Revalidator;
use Drupal\Core\Form\FormStateInterface;
use Drupal\next\Event\EntityActionEvent;
use Drupal\next\Plugin\ConfigurableRevalidatorBase;
/**
* Provides a configuratble revalidator.
*
* @Revalidator(
* id = "configurable_revalidator",
* label = "Configurable Revalidator",
* description = "Description for the configurable revalidator"
* )
*/
class ConfigurableRevalidator extends ConfigurableRevalidatorBase {
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return [
'message' => NULL,
];
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['message'] = [
'#type' => 'textfield',
'#title' => $this->t('Message'),
'#default_value' => $this->configuration['message'],
];
return $form;
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['message'] = $form_state->getValue('message');
}
/**
* {@inheritdoc}
*/
public function revalidate(EntityActionEvent $event): bool {
// Get the configuration.
$message = $this->configuration['message'];
}
}

您还应该在 web/modules/custom/custom_module/config/custom_module.schema.yml 提供架构定义。

next.revalidator.configuration.configurable_revalidator:
type: mapping
mapping:
message:
type: string
label: "Message"