Như API cấu hình cho biết, mỗi mô-đun cần xác định lược đồ cấu hình của nó trong các tệp trong thư mục config/schema trong thư mục mô-đun cấp cao nhất. Điều đó được lõi Drupal sử dụng để xác thực tệp cấu hình và xác minh rằng nó không bị hỏng.
Ví dụ: mô-đun Sách sử dụng lược đồ sau đây cho đối tượng cấu hình của nó (lõi/mô-đun/book/config/schema/book.schema.yml).
# Lược đồ cho các tệp cấu hình của mô-đun sách.
sách.settings:
gõ: config_object
nhãn: 'Cài đặt sách'
lập bản đồ:
allow_types:
loại: trình tự
nhãn: 'Các loại nội dung được phép trong đề cương sách'
sự nối tiếp:
loại: chuỗi
nhãn: 'Loại nội dung'
chặn:
loại: lập bản đồ
nhãn: 'Chặn'
lập bản đồ:
dẫn đường:
loại: lập bản đồ
nhãn: 'Điều hướng'
lập bản đồ:
cách thức:
loại: chuỗi
nhãn: 'Chế độ'
con_type:
loại: chuỗi
nhãn: 'Loại nội dung cho các trang con'
block.settings.book_navlation:
gõ: block_settings
nhãn: 'Khối điều hướng sách'
lập bản đồ:
chế độ chặn:
loại: chuỗi
nhãn: 'Chế độ hiển thị khối'
Điều đó khác với tệp cấu hình của nó, nằm trong lõi/mô-đun/book/config/installbook.settings.yml.
allow_types:
- sách
chặn:
dẫn đường:
chế độ: 'tất cả các trang'
con_type: cuốn sách
Mã ném ngoại lệ đó được chứa trong ConfigSchemaChecker
lớp, được sử dụng để triển khai một người đăng ký sự kiện được gọi khi một đối tượng cấu hình được lưu.
chức năng công khai onConfigSave(ConfigCrudEvent $event) {
// Chỉ xác thực cấu hình nếu trong bộ sưu tập mặc định. Khác
// bộ sưu tập có thể có cấu hình không đầy đủ (ví dụ ngôn ngữ
// chỉ ghi đè). Bản thân chúng không có giá trị.
$saved_config = $event->getConfig();
if ($saved_config->getStorage()->getCollectionName() != StorageInterface::DEFAULT_COLLECTION) {
trở lại;
}
$name = $saved_config->getName();
$data = $saved_config->get();
$checksum = Crypt::hashBase64(serialize($data));
if (!in_array($name, $this->exclude) && !isset($this->checked[$name . ':' . $checksum])) {
$this->checked[$name . ':' . $checksum] = TRUE;
$errors = $this->checkConfigSchema($this->typedManager, $name, $data);
nếu ($lỗi === FALSE) {
ném new SchemaIncompleteException("Không có lược đồ nào cho {$name}");
}
otherif (is_array($errors)) {
$text_errors = [];
foreach ($errors as $key => $error) {
$text_errors[] = new FormattableMarkup('@key @error', [
'@key' => $key,
'@lỗi' => $lỗi,
]);
}
throw new SchemaIncompleteException("Lỗi lược đồ cho {$name} với các lỗi sau: " . implode(', ', $text_errors));
}
}
}