Upload
kelyon-srl
View
176
Download
3
Embed Size (px)
Citation preview
1
Managing Configuration in Drupal 8Raffaele Chiocca
Technical Architect @Kelyon
2
Managing Configuration in Drupal 8
Drupal 8 dispone di un sistema totalmente nuovo per memorizzare la configurazione in maniera uniforme e affidabile.
Tutta la configurazione di Drupal 8 , dai moduli abilitati ai fields sono memorizzati utilizzando questo sistema.
Questa funzionalità rimpiazza la necessità del modulo contrib Features che in Drupal 8 ritornerà al suo scopo originario.
15/04/20233
Code-Driven Configuration in Drupal
• In Drupal la configurazione e i contenuti sono sempre stati memorizzati nello stesso database, ogni volta che si effettuava una modifica dall’interfaccia di amministrazione la modifica non veniva tracciata.
• Drupal 6 : Prima Versione di Features con la possibilità di esportare la configurazione in codice PHP.
• Drupal 7 : Il supporto a Features è maturo, ma non tutti i componenti sono esportabili, inoltre deve utilizzare moduli di terze parti per coprire i diversi use-cases.
• Drupal 8 : Il core è stato progettato per gestire la configurazione in maniera“Code-Driven”. Configurazione e contenuti vengono gestiti in maniera separata, la configurazione è gestita tramite un sistema text-based.
15/04/20234
Approccio Drupal 6-7 (core)
• Default in Drupal 6 e Drupal 7 (core) – Database Driven• Approccio standard, al click Drupal salva la
configurazione nel database e dimentica.• Svantaggi : configurazioni e contenuti vengono
mischiati.• Svantaggi : Per effettuare il deployment in un
ambiente di produzione è necessario eseguire step-by-step tutte le configurazioni.• Svantaggi : I cambiamenti alle configurazioni non
vengono tracciati.
15/04/20235
Approccio Drupal 7 + Features
• Per consentire l’export delle funzionalità è necessario renderle “esportabili”.• La problematica situazione degli “Overridden”.• Non tutto è esportabile tramite features.• Per esportare la configurazione con Features è
necessario inserire gli elementi in una “lista” e non si ha mai il controllo completo dell’ambiente.• Features è perfetto per il packaging delle funzionalità ma
non per l’esportazione delle funzionalità, non è possibile esportare delle configurazioni senza prima effettuarne il packaging.
15/04/20236
Qual è il problema da risolvere? (1/2)
15/04/20237
Qual è il problema da risolvere? (2/2)
15/04/20238
La soluzione implementata in Drupal 8
• La configurazione è gestita tramite un sistema “text-driven”• Tutti i files di configurazione rispettano le specifiche YAML
(Yet Another Markup Language)• Le configurazioni “active” e “staging” sono separate.• La configurazione “Active” viene memorizzata nel database
(configurazione di default).• è possibile cambiare i settaggi dei configuration repositories
“Active” e “Staging” nel settings.php
15/04/20239
Formato dei files di configurazione
YAML• Dichiarativo• Parsato• Si trova in cartelle specifiche
chiamate “config”• è trattato in maniera
differente.
PHP• Imperativo• Interpretato• Può trovarsi nella stessa
cartella del modulo• è trattato a tutti gli effetti
come un modulo
15/04/202310
Anatomia di un Drupal 8 configuration file (1/2)
• Dal modulo system del core di Drupal 8 filename : system.site.yml
15/04/202311
Anatomia di un Drupal 8 configuration file (2/2)
system.site.yml• uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa'• name: 'SIDCAMP 2015'• mail: '[email protected]'• slogan: ‘sidcamp'• page:• 403: ’access-denied'• 404: ’not-found'• front: user/login• admin_compact_mode: false• weight_select_max: 100• langcode: en• default_langcode: en
15/04/202312
Configuration API@see \Drupal\Core\Config\Config
MAIN ENTRY POINT : \Drupal::config()\Drupal\Core\Config\ConfigFactory (SET/SAVE)\Drupal\Core\Config\ImmutableConfig (GET)
\Drupal\Core\Form\ConfigFormBaseTrait (fornisce ai form una modalità di accesso alla configurazione
\Drupal\Core\Form\ConfigFormBase)
15/04/202313
Accesso ai dati
15/04/202314
Config API (1/4)$site_name = \Drupal::config('system.site')->get('name');-----------------------------------------------------------------------------uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa’name : 'SIDCAMP 2015'mail: '[email protected]'slogan: ‘sidcamp'page: 403: ’access-denied' 404: ’not-found' front: user/loginadmin_compact_mode: falseweight_select_max: 100langcode: endefault_langcode: en
15/04/202315
Config API (2/4)$page_data = \Drupal::config(‘system.site’)->get(‘page’);-----------------------------------------------------------------------------uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa’name : 'SIDCAMP 2015'mail: '[email protected]'slogan: ‘sidcamp'page: 403 : ’access-denied' 404 : ’not-found' front : user/loginadmin_compact_mode: falseweight_select_max: 100langcode: endefault_langcode: en
15/04/202316
Config API (3/4)$front_page = \Drupal::config(‘system.site’)->get(‘page.front’);-----------------------------------------------------------------------------uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa’name : 'SIDCAMP 2015'mail: '[email protected]'slogan: ‘sidcamp'page: 403 : ’access-denied' 404 : ’not-found' front : user/loginadmin_compact_mode: falseweight_select_max: 100langcode: endefault_langcode: en
15/04/202317
Config API (4/4)$site_config = \Drupal::config(‘system.site’)->get();-----------------------------------------------------------------------------uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa’name: 'SIDCAMP 2015'mail: '[email protected]’slogan: ‘sidcamp’page: 403 : ’access-denied' 404 : ’not-found' front : user/loginadmin_compact_mode: falseweight_select_max: 100langcode: endefault_langcode: en
15/04/202318
Salvataggio della configurazione
15/04/202319
15/04/202320
Salvataggio della configurazione
Istanzia un config object per ogni configuration object name (‘system.site’) che riceve. \Drupal::configFactory()->getEditable('system.site') ->set('name', "SIDCAMP AND PIZZA") ->save();----------------------------------------------------------------------------------------------------------------------uuid: 'd54e0656-a8af-4181-b116-22a304ff3caa’name: 'SIDCAMP AND PIZZA'mail: '[email protected]’slogan: ‘sidcamp’page: 403 : ’access-denied' 404 : ’not-found' front : node
15/04/202321
Drupal 8 State APILa variabile ha senso solo per l’ambiente attuale ? Esempi : L’ultima volta in cui sono stati controllati gli aggiornamenti di Drupal $last_cron_run
In questo caso va utilizzata la State API di Drupal 8.
L’entry point a questa API è \Drupal::state() e restituisce un oggetto di tipo \Drupal\Core\State\StateInterface
Esecuzione del cron di Drupal:$last_cron_run = \Drupal::state()->get(‘system.cron_last’);\Drupal::state()->set(‘system.cron_last’, REQUEST_TIME);
15/04/202322
Deployment Steps (1/2)
15/04/202323
Deployment Steps (2/2)
15/04/202324
Configuration Schema (1/2)
system.maintenance.yml-----------------------------------------------------------------------------enabled: 0Message : ‘@site is currently under maintenance. We should be back shortly. Thank you for your patience.’
15/04/202325
Configuration Schema (2/2)
system.maintenance.yml-----------------------------------------------------------------------------System.maintenance: type : mapping label : “Maintenance mode” mapping : “enabled”: type : boolean label : “Put site into maintenance mode” “message” : type : text label : “Message to display when in maintenance mode”
15/04/202326
Configuration Overrides
15/04/202327
Override di una configurazione
• system.maintenance.ymlSovrascrivere globalmente il messaggio mostrato in
modalità di manutenzione.---------------------------------------------------------------------Global $conf ;$conf[‘system.maintenance’][‘message’] = ‘Sorry,
SIDCAMP is down now’;
15/04/202328
Evitare i config overrides
system.maintenance.ymlOttenere il messaggio di manutenzione “originale” prima del nostro override.-----------------------------------------------------------------------------OTTIENI IL MESSAGGIO CON GLI OVERRIDES -> (‘SIDCAMP IS DOWN NOW’)
$maintenance_message = \Drupal::config('system.maintenance')->get(’message');
OTTIENI IL MESSAGGIO SENZA GLI OVERRIDES -> (‘@site is currently under maintenance….)
$maintenance_message_editable = \Drupal::configFactory()->getEditable('system.maintenance')->get('message');
15/04/202329
Effettuare overrides da un modulo custom (1/2)
services: config_example.overrider: class: \Drupal\config_example\ConfigExampleOverrides tags: - {name: config.factory.override, priority: 5}
@seeUn esempio rilevante da vedere in questo caso è la seguente interfaccia interface LanguageConfigFactoryOverrideInterface(modulo language del core di drupal)
config_example.service.yml
15/04/202330
ConfigExampleOverrides.php/** * @file * Contains \Drupal\config_example\ConfigExampleOverrides. */
namespace Drupal\config_example;
use Drupal\Core\Config\ConfigFactoryOverrideInterface;
/** * Example configuration override. */class ConfigModuleOverrides implements ConfigFactoryOverrideInterface {
public function loadOverrides($names) { $overrides = array(); if (in_array('system.site', $names)) { $overrides['system.site'] = ['name' => ’SIDCAMP overriden site name!']; } return $overrides; }}
Effettuare overrides da un modulo custom (2/2)