เนื่องจาก API การกำหนดค่า กล่าวว่า แต่ละโมดูลจำเป็นต้องกำหนดโครงร่างการกำหนดค่าในไฟล์ในไดเร็กทอรี config/schema ภายใต้ไดเร็กทอรีโมดูลระดับบนสุด ซึ่งใช้โดย Drupal core เพื่อตรวจสอบความถูกต้องของไฟล์คอนฟิกูเรชันและยืนยันว่าไม่ได้เสียหาย
ตัวอย่างเช่น โมดูล Book ใช้สคีมาต่อไปนี้สำหรับอ็อบเจ็กต์การกำหนดค่า (core/modules/book/config/schema/book.schema.yml)
# Schema สำหรับไฟล์การกำหนดค่าของโมดูลหนังสือ
หนังสือการตั้งค่า:
ประเภท: config_object
ป้ายกำกับ: 'การตั้งค่าหนังสือ'
การทำแผนที่:
Allow_types:
ชนิด: ลำดับ
ป้ายกำกับ: 'อนุญาตประเภทเนื้อหาในโครงร่างหนังสือ'
ลำดับ:
ประเภท: สตริง
ป้ายกำกับ: 'ประเภทเนื้อหา'
บล็อก:
ประเภท: การทำแผนที่
ป้ายกำกับ: 'บล็อค'
การทำแผนที่:
การนำทาง:
ประเภท: การทำแผนที่
ป้ายกำกับ: 'การนำทาง'
การทำแผนที่:
โหมด:
ประเภท: สตริง
ป้ายกำกับ: 'โหมด'
child_type:
ประเภท: สตริง
ป้ายกำกับ: 'ประเภทเนื้อหาสำหรับเพจย่อย'
block.settings.book_navigation:
พิมพ์: block_settings
ป้ายกำกับ: 'บล็อกการนำทางหนังสือ'
การทำแผนที่:
block_mode:
ประเภท: สตริง
ป้ายกำกับ: 'บล็อกโหมดการแสดงผล'
ซึ่งแตกต่างจากไฟล์คอนฟิกูเรชัน ซึ่งอยู่ใน core/modules/book/config/installbook.settings.yml
Allow_types:
- หนังสือ
บล็อก:
การนำทาง:
โหมด: 'ทุกหน้า'
child_type: หนังสือ
รหัสที่โยนข้อยกเว้นนั้นมีอยู่ใน ConfigSchemaChecker
คลาส ใช้เพื่อใช้งานสมาชิกเหตุการณ์ที่เรียกใช้เมื่อมีการบันทึกออบเจกต์การกำหนดค่า
ฟังก์ชั่นสาธารณะ onConfigSave (ConfigCrudEvent $event) {
// ตรวจสอบการกำหนดค่าหากอยู่ในคอลเล็กชันเริ่มต้นเท่านั้น อื่น
// คอลเลกชันอาจมีการกำหนดค่าที่ไม่สมบูรณ์ (เช่น ภาษา
// แทนที่เท่านั้น). สิ่งเหล่านี้ไม่ถูกต้องในตัวเอง
$saved_config = $event->getConfig();
ถ้า ($saved_config->getStorage()->getCollectionName() != StorageInterface::DEFAULT_COLLECTION) {
กลับ;
}
$name = $saved_config->getName();
$data = $saved_config->get();
$checksum = Crypt::hashBase64(ซีเรียลไลซ์($data));
if (!in_array($name, $this->exclude) && !isset($this->checked[$name . ':' . $checksum])) {
$this->ตรวจสอบแล้ว[$name ':' . $checksum] = จริง;
$errors = $this->checkConfigSchema($this->typedManager, $name, $data);
ถ้า ($ ข้อผิดพลาด === เท็จ) {
โยน new SchemaIncompleteException("ไม่มี schema สำหรับ {$name}");
}
อื่น (is_array ($ ข้อผิดพลาด)) {
$text_errors = [];
foreach ($ ข้อผิดพลาดเป็น $key => $error) {
$text_errors[] = ใหม่ FormattableMarkup('@key @error', [
'@key' => $คีย์
'@error' => $ข้อผิดพลาด
]);
}
โยน new SchemaIncompleteException("ข้อผิดพลาดของ Schema สำหรับ {$name} ที่มีข้อผิดพลาดต่อไปนี้: " .implode(', ', $text_errors));
}
}
}