La fel de API de configurare spune, fiecare modul trebuie să-și definească schema de configurare în fișierele din directorul config/schema din directorul modulului de nivel superior. Acesta este folosit de core Drupal pentru a valida fișierul de configurare și pentru a verifica că nu este corupt.
De exemplu, modulul Book folosește următoarea schemă, pentru obiectul său de configurare (core/modules/book/config/schema/book.schema.yml).
# Schema pentru fișierele de configurare ale modulului de carte.
setări.carte:
tip: config_object
etichetă: „Setări de carte”
cartografiere:
tipuri_permise:
tip: secvență
etichetă: „Tipuri de conținut permise în contururile cărților”
secvenţă:
tip: sfoară
etichetă: „Tipul de conținut”
bloc:
tip: cartografiere
etichetă: „Blocați”
cartografiere:
navigare:
tip: cartografiere
etichetă: „Navigație”
cartografiere:
modul:
tip: sfoară
etichetă: „Mod”
tip_copil:
tip: sfoară
etichetă: „Tipul de conținut pentru paginile secundare”
block.settings.book_navigation:
tip: block_settings
etichetă: „Bloc de navigare pentru carte”
cartografiere:
block_mode:
tip: sfoară
etichetă: „Blocați modul de afișare”
Acesta este diferit de fișierul său de configurare, care se află în core/modules/book/config/installbook.settings.yml.
tipuri_permise:
- carte
bloc:
navigare:
modul: „toate paginile”
tip_copil: carte
Codul care aruncă acea excepție este conținut în ConfigSchemaChecker
clasă, folosită pentru a implementa un abonat de eveniment care este invocat atunci când un obiect de configurare este salvat.
funcția publică onConfigSave(ConfigCrudEvent $event) {
// Validează configurația doar dacă se află în colecția implicită. Alte
// colecțiile pot avea o configurație incompletă (de exemplu limba
// suprascrie numai). Acestea nu sunt valabile în sine.
$saved_config = $event->getConfig();
dacă ($saved_config->getStorage()->getCollectionName() != StorageInterface::DEFAULT_COLLECTION) {
întoarcere;
}
$nume = $config_salvat->getName();
$date = $saved_config->get();
$checksum = Crypt::hashBase64(serialize($date));
if (!in_array($nume, $this->exclude) && !isset($this->checked[$name . ':' . $checksum])) {
$this->bifat[$name . ':' . $checksum] = TRUE;
$erori = $this->checkConfigSchema($this->typedManager, $name, $data);
dacă ($erori === FALSE) {
throw new SchemaIncompleteException("Nici o schemă pentru {$nume}");
}
elseif (este_matrice($erori)) {
$text_errors = [];
foreach ($erori ca $key => $eroare) {
$text_errors[] = nou FormattableMarkup('@key @error', [
'@key' => $key,
'@error' => $eroare,
]);
}
throw new SchemaIncompleteException("Erori de schemă pentru {$name} cu următoarele erori: " . implode(', ', $text_errors));
}
}
}