30
Managing Configuration in Drupal 8 Raffaele Chiocca Technical Architect @Kelyon 1

Managing configuration in Drupal 8 - SIDCamp 2015

Embed Size (px)

Citation preview

Page 1: Managing configuration in Drupal 8 - SIDCamp 2015

1

Managing Configuration in Drupal 8Raffaele Chiocca

Technical Architect @Kelyon

Page 2: Managing configuration in Drupal 8 - SIDCamp 2015

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.

Page 3: Managing configuration in Drupal 8 - SIDCamp 2015

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.

Page 4: Managing configuration in Drupal 8 - SIDCamp 2015

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.

Page 5: Managing configuration in Drupal 8 - SIDCamp 2015

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.

Page 6: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/20236

Qual è il problema da risolvere? (1/2)

Page 7: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/20237

Qual è il problema da risolvere? (2/2)

Page 8: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 9: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 10: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202310

Anatomia di un Drupal 8 configuration file (1/2)

• Dal modulo system del core di Drupal 8 filename : system.site.yml

Page 11: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 12: Managing configuration in Drupal 8 - SIDCamp 2015

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)

Page 13: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202313

Accesso ai dati

Page 14: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 15: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 16: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 17: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 18: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202318

Salvataggio della configurazione

Page 19: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202319

Page 20: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 21: Managing configuration in Drupal 8 - SIDCamp 2015

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);

Page 22: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202322

Deployment Steps (1/2)

Page 23: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202323

Deployment Steps (2/2)

Page 24: Managing configuration in Drupal 8 - SIDCamp 2015

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.’

Page 25: Managing configuration in Drupal 8 - SIDCamp 2015

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”

Page 26: Managing configuration in Drupal 8 - SIDCamp 2015

15/04/202326

Configuration Overrides

Page 27: Managing configuration in Drupal 8 - SIDCamp 2015

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’;

Page 28: Managing configuration in Drupal 8 - SIDCamp 2015

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');

Page 29: Managing configuration in Drupal 8 - SIDCamp 2015

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

Page 30: Managing configuration in Drupal 8 - SIDCamp 2015

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)