Drupal 8
Configuration Management
Phil Norton
Drupal Camp Yorkshire 2014
DrupalCamp Yorkshire 2014
Me
• Phil Norton (@philipnorton42)
• #! code (www.hashbangcode.com)
• Technical Lead at Access
• Help run NWDUG
What Is Drupal
Config?
!
A quick quiz
Blog post
Permissions
Vocabulary
Taxonomy term
Field definition
Menu
Variable
Menu item
User
Contents of a block
Configuration Content
Blog Post
!
Taxonomy Term
!
Menu Item
!
Block Content
Permissions
!
Field Definition
!
Vocabulary
!
Me...
Configuration Content
Blog Post
!
Taxonomy Term
!
Menu Item
!
Block Content
Permissions
!
Field Definition
!
Vocabulary
!
Me...
Content
!
!
Session
!
!
State
!
!
Configuration
An article page, uploaded files
Logged in status, shopping carts
Last cron r...
Challenge
• Developer:
• Wants to work on code
• Wants to change the config
• Wants to deploy across environments
• Client:...
Current Situation
Drupal 7 Configuration
• Features
• Install/Update hooks
• Install Profiles
How do we currently manage configuration in Drupa...
Features
• Export and import of certain configurations as
modules
• Not all modules supported so there tends to be
gaps in ...
Install/Update Hooks
• Create tables
• Set up variables
• Fill in ‘gaps’ in Features modules
Install Profiles
• Combine Features modules and install hooks
• Full site setup out of the box
• Limited Drupal API availab...
What’s Next In
Drupal 8?
Drupal 8 Initiatives
• Configuration Management
• Web Services
• Multilingual
• HTML 5
• Mobile
CMI
Configuration Management Initiative
http://bit.ly/1tDBbsA
!
http://drupal8cmi.org
CMI
• Lead by Greg Dunlap - (heyrocker)
Also involved are:
• Joel Farris (senpai)
• Jonathan Lambert (jlambert)
• David St...
CMI
To build Drupal from the ground up to be better at
configuration management
CMI
• Move configuration management into core
• Allow storage of configuration in files
• Allow the transfer of configuration ...
Usage
Behind The Scenes
• Active configuration is stored in the database
• Clicking Export collates the configuration that each
mo...
Behind The Scenes
• YAML files are used to store the configuration
• A ‘staging’ and an ‘active’ directory are defined in
set...
active
• Originally intended to be used as the location of the
active configuration
• Active configuration is now stored in ...
staging
• Stores current imported configuration as YAML files
• Shows difference between configuration changes
• Changes made...
YAML!
YAML Ain't Markup Language
!
(Yet Another Markup Language)
YAML
• Data orientated format
• Has several benefits over other formats like INI,
JSON, XML
• Support for hierarchical valu...
YAML
• Simple values defined by
key: value
• Hierarchical values defined with whitespace
keys:
key1: value
key2: value
YAML
Comments start the line with a ‘#’
!
# This is a comment
item: value
YAML Lists
!
- item1
- item2
- item3
!
!
[item1, item2, item3]
!
!
- {name: 'webserver1', ip: ‘192.168.100.100’}
- {name: ...
uuid: ''	
name: Drupal	
mail: ''	
slogan: ''	
page:	
403: ''	
404: ''	
front: user	
admin_compact_mode: false	
weight_sele...
YAML Filenames In Drupal 8
• < module >.< component >.yml



system.settings.yml

views.settings.yml
• < module >.< compon...
Configuration API
Configuration Schema
• Needed to define what your configuration will hold
• Kwalify inspired format
• Used to define what type...
system.schema.yml
system.site:	
type: mapping	
label: 'Site information'	
mapping:	
uuid:	
type: string	
label: 'Site UUID...
system.schema.yml
system.site:	
type: mapping	
label: 'Site information'	
mapping:	
uuid:	
type: string	
label: 'Site UUID...
system.schema.yml
system.site:	
type: mapping	
label: 'Site information'	
mapping:	
uuid:	
type: string	
label: 'Site UUID...
system.schema.yml
system.site:	
type: mapping	
label: 'Site information'	
mapping:	
uuid:	
type: string	
label: 'Site UUID...
system.schema.yml
system.site:	
type: mapping	
label: 'Site information'	
mapping:	
uuid:	
type: string	
label: 'Site UUID...
Simple Configuration
• Can be single values or arrays of values
• Used to store global configuration options
• Easy to imple...
Getting Configuration
uuid: ''	
name: Drupal	
mail: ''	
slogan: ''	
page:	
403: ''	
404: ''	
front: user	
admin_compact_mod...
Getting Configuration
uuid: ''	
name: Drupal	
mail: ''	
slogan: ''	
page:	
403: ''	
404: ''	
front: user	
admin_compact_mod...
Setting Configuration
$config = Drupal::config('system.site');

$config->set(‘mail’, ‘test@example.com’);

$config->save();...
Clear Configuration
$config = Drupal::config('system.site');	
$config->clear('mail')->save();





!
Drupal::config('system...
Configuration Entities
• Used to store custom entity configurations
• More complex and therefore harder to implement
• Used ...
Contact Category Interface
namespace Drupalcontact;	
!
use DrupalCoreConfigEntityConfigEntityInterface;	
!
/**	
* Provides...
Contact Category Entity
namespace DrupalcontactEntity;	
!
use DrupalCoreConfigEntityConfigEntityBase;	
use DrupalCoreEntit...
class Category extends ConfigEntityBase implements CategoryInterface {	
!
/**	
* The category ID.	
*	
* @var string	
*/	
p...
contact.category.personal.yml
id: personal	
label: 'Personal contact form'	
recipients: { }	
reply: ''	
weight: 0	
status:...
contact.category.personal.yml
id: personal	
label: 'Personal contact form'	
recipients: { }	
reply: ''	
weight: 0	
status:...
Drush
• Full Drush integration available
• Need Drush version 7.x
• Currently in dev branch of Drush
• List of Drush comma...
Drush
Export config from the active configuration to the
staging directory



drush config-export



drush cex
Drush
Import the staging configuration into the active
configuration



drush config-import



drush cim
Workflow
• Staging config should become part of your
codebase
• New configuration changes should be exported
and integrated i...
Dev Stage Live
export
deploy deploy
import import
Git
Config
Code
Git
Config
Code
Git
Config
Code
Workflow
Dev Stage Live
drush cex
deploy deploy
drush cim drush cim
Git
Config
Code
Git
Config
Code
Git
Config
Code
Drush Workflow
Roll Your Own
Configurations
!
!
!
!
Create a module that stores simple configurations
MyModule
• A module that integrates with the configuration
management API
• Defines a single configuration item
• Defines a pa...
MyModule Configuration
• mymodule.info.yml file defines the module
• mymodule.settings.yml contains the module
configuration
•...
name: 'MyModule'	
type: module	
description: 'My module'	
version: VERSION	
core: 8.x
mymodule.info.yml
configitem: ''
/config/install/mymodule.settings.yml
mymodule.settings:	
type: mapping	
label: 'My Module Settings'	
mapping:	
configitem:	
type: string	
label: 'A config item...
mymodule.page:	
path: '/mymodule'	
defaults:	
_content: 'DrupalmymoduleController
MyModuleController::description'	
requir...
MyModule Page
• mymodule.routing.yml defines the route to the page
• Destination MyModuleController::description()
loads th...
namespace DrupalmymoduleController;	
!
use DrupalCoreControllerControllerBase;	
!
/**	
* Custom page.	
*/	
class MyModuleC...
MyModule Form
• mymodule.routing.yml defines the route to the form
• Class MyModuleAdminForm defines a form that
loads the c...
namespace DrupalmymoduleForm;	
!
use DrupalCoreFormConfigFormBase;	
!
/**	
* Configure MyModule admin settings for this si...
!
/**	
* Implements DrupalCoreFormFormInterface::buildForm().	
*/	
public function buildForm(array $form, array &$form_sta...
!
!
/**	
* Implements DrupalCoreFormFormInterface::submitForm().	
*/	
public function submitForm(array &$form, array &$for...
configitem: 'another value'
Drupal 7
• Configuration management has been back ported
into Drupal 7
• Configuration Management module 

https://drupal.or...
Resources
• Creating Drupal 8.x modules

https://drupal.org/developing/modules/8
!
• Configuration API in Drupal 8

https:/...
Drupal 8 CMI Needs You!
• Lots of work still needs to be done on CMI
• Go to http://drupal8cmi.org/ and pick an issue to
w...
Me
• Phil Norton (@philipnorton42)
• #! code (www.hashbangcode.com)
• Technical Lead at Access
• Help run NWDUG
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Drupal 8 Configuration Management
Upcoming SlideShare
Loading in …5
×

Drupal 8 Configuration Management

4,432 views

Published on

The configuration management system in Drupal 8 seems like a great idea, but what is it? In this session I hope to show what configuration management is, why it is needed and how it will make all of our lives as Drupal site builders better.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,432
On SlideShare
0
From Embeds
0
Number of Embeds
53
Actions
Shares
0
Downloads
30
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Drupal 8 Configuration Management

  1. 1. Drupal 8 Configuration Management Phil Norton Drupal Camp Yorkshire 2014 DrupalCamp Yorkshire 2014
  2. 2. Me • Phil Norton (@philipnorton42) • #! code (www.hashbangcode.com) • Technical Lead at Access • Help run NWDUG
  3. 3. What Is Drupal Config? ! A quick quiz
  4. 4. Blog post
  5. 5. Permissions
  6. 6. Vocabulary
  7. 7. Taxonomy term
  8. 8. Field definition
  9. 9. Menu
  10. 10. Variable
  11. 11. Menu item
  12. 12. User
  13. 13. Contents of a block
  14. 14. Configuration Content Blog Post ! Taxonomy Term ! Menu Item ! Block Content Permissions ! Field Definition ! Vocabulary ! Menu ! Variable TAC ! Webform ! Default Content ! Views
  15. 15. Configuration Content Blog Post ! Taxonomy Term ! Menu Item ! Block Content Permissions ! Field Definition ! Vocabulary ! Menu ! Variable TAC ! Webform ! Default Content ! Views
  16. 16. Content ! ! Session ! ! State ! ! Configuration An article page, uploaded files Logged in status, shopping carts Last cron run Everything else
  17. 17. Challenge • Developer: • Wants to work on code • Wants to change the config • Wants to deploy across environments • Client: • Wants to work on content • Doesn’t want to lose work
  18. 18. Current Situation
  19. 19. Drupal 7 Configuration • Features • Install/Update hooks • Install Profiles How do we currently manage configuration in Drupal?
  20. 20. Features • Export and import of certain configurations as modules • Not all modules supported so there tends to be gaps in the configuration • Adding Features support for modules is not easy • Features ‘Overridden’ sadness
  21. 21. Install/Update Hooks • Create tables • Set up variables • Fill in ‘gaps’ in Features modules
  22. 22. Install Profiles • Combine Features modules and install hooks • Full site setup out of the box • Limited Drupal API available • Doesn’t always work as planned
  23. 23. What’s Next In Drupal 8?
  24. 24. Drupal 8 Initiatives • Configuration Management • Web Services • Multilingual • HTML 5 • Mobile
  25. 25. CMI Configuration Management Initiative http://bit.ly/1tDBbsA ! http://drupal8cmi.org
  26. 26. CMI • Lead by Greg Dunlap - (heyrocker) Also involved are: • Joel Farris (senpai) • Jonathan Lambert (jlambert) • David Strauss (davidstrauss) • Larry Garfield (crell) • Karoly Negeyesi (chx) • Angie Byron (webchick) • Alex Pott (alexpott) • And many others…
  27. 27. CMI To build Drupal from the ground up to be better at configuration management
  28. 28. CMI • Move configuration management into core • Allow storage of configuration in files • Allow the transfer of configuration between environments • Create an API to allow custom configurations • Integrate UUID into core so certain configurations can be given machine names
  29. 29. Usage
  30. 30. Behind The Scenes • Active configuration is stored in the database • Clicking Export collates the configuration that each module defines and combines it with the current active configuration • Export contains the active configuration in the form of YAML files
  31. 31. Behind The Scenes • YAML files are used to store the configuration • A ‘staging’ and an ‘active’ directory are defined in settings.php • Used to store and compare the current configuration • By default the directories are stored in the location
 /sites/default/files/config_<hash>/
  32. 32. active • Originally intended to be used as the location of the active configuration • Active configuration is now stored in the database • Configuration development module (https:// drupal.org/project/config_devel)
  33. 33. staging • Stores current imported configuration as YAML files • Shows difference between configuration changes • Changes made here can be imported into active configuration
  34. 34. YAML! YAML Ain't Markup Language ! (Yet Another Markup Language)
  35. 35. YAML • Data orientated format • Has several benefits over other formats like INI, JSON, XML • Support for hierarchical values • Lists and associative arrays possible • Used extensively in Drupal 8
  36. 36. YAML • Simple values defined by key: value • Hierarchical values defined with whitespace keys: key1: value key2: value
  37. 37. YAML Comments start the line with a ‘#’ ! # This is a comment item: value
  38. 38. YAML Lists ! - item1 - item2 - item3 ! ! [item1, item2, item3] ! ! - {name: 'webserver1', ip: ‘192.168.100.100’} - {name: 'webserver2', ip: ‘192.168.100.101’} - {name: 'webserver3', ip: ‘192.168.100.102’}
  39. 39. uuid: '' name: Drupal mail: '' slogan: '' page: 403: '' 404: '' front: user admin_compact_mode: false weight_select_max: 100 langcode: en core/modules/system/config/install/system.site.yml
  40. 40. YAML Filenames In Drupal 8 • < module >.< component >.yml
 
 system.settings.yml
 views.settings.yml • < module >.< component >.< entity >.yml
 
 image.style.medium.yml
 views.view.content.yml
  41. 41. Configuration API
  42. 42. Configuration Schema • Needed to define what your configuration will hold • Kwalify inspired format • Used to define what types of data the configuration will contain • See more at: https://drupal.org/node/1905070
  43. 43. system.schema.yml system.site: type: mapping label: 'Site information' mapping: uuid: type: string label: 'Site UUID' name: type: label label: 'Site name' mail: type: email label: 'E-mail address' slogan: type: label label: 'Slogan' page: type: mapping label: 'Pages' mapping: 403: type: path label: 'Default 403 (access denied) page' 404: type: path label: 'Default 404 (not found) page' front: type: path label: 'Default front page' admin_compact_mode: type: boolean label: 'Compact mode' weight_select_max: type: integer label: 'Weight element maximum value' langcode: type: string label: 'Default language'
  44. 44. system.schema.yml system.site: type: mapping label: 'Site information' mapping: uuid: type: string label: 'Site UUID' name: type: label label: 'Site name' Schema name Also shows the configuration filename “system.site.yml” Used to reference this configuration
  45. 45. system.schema.yml system.site: type: mapping label: 'Site information' mapping: uuid: type: string label: 'Site UUID' name: type: label label: 'Site name' Container data type ‘mapping’ is for key value sets allows for associative arrays of different data types
  46. 46. system.schema.yml system.site: type: mapping label: 'Site information' mapping: uuid: type: string label: 'Site UUID' name: type: label label: 'Site name' Label Used as an interface label
  47. 47. system.schema.yml system.site: type: mapping label: 'Site information' mapping: uuid: type: string label: 'Site UUID' name: type: label label: 'Site name' Start of mapping section item key item type item label
  48. 48. Simple Configuration • Can be single values or arrays of values • Used to store global configuration options • Easy to implement: • Create schema YAML file in 
 < module >/config/install/schema • Create config YAML file 
 < module >/config/install
  49. 49. Getting Configuration uuid: '' name: Drupal mail: '' slogan: '' page: 403: '' 404: '' front: user admin_compact_mode: false weight_select_max: 100 langcode: en ! ! $config = Drupal::config('system.site');
 $email = $config->get('mail');
 ! $cofig = Drupal::config(‘system.site') $page403 = $config->get('page.403');
 

  50. 50. Getting Configuration uuid: '' name: Drupal mail: '' slogan: '' page: 403: '' 404: '' front: user admin_compact_mode: false weight_select_max: 100 langcode: en ! ! $email = Drupal::config('system.site')->get('mail');
 ! $page403 = Drupal::config('system.site')->get('page.403');
 
 !
  51. 51. Setting Configuration $config = Drupal::config('system.site');
 $config->set(‘mail’, ‘test@example.com’);
 $config->save();
 ! ! $config = Drupal::config(‘system.site’)->set('mail', ‘test@example.com’);
 $config->save(); ! ! 
 Drupal::config(‘system.site’)->set('mail', ‘test@example.com)- >save();
  52. 52. Clear Configuration $config = Drupal::config('system.site'); $config->clear('mail')->save();
 
 
 ! Drupal::config('system.site')->delete();
  53. 53. Configuration Entities • Used to store custom entity configurations • More complex and therefore harder to implement • Used for configurations that have multiple entries
 Example: Views, Image cache settings, Contact form categories
  54. 54. Contact Category Interface namespace Drupalcontact; ! use DrupalCoreConfigEntityConfigEntityInterface; ! /** * Provides an interface defining a contact category entity. */ interface CategoryInterface extends ConfigEntityInterface { ! }
  55. 55. Contact Category Entity namespace DrupalcontactEntity; ! use DrupalCoreConfigEntityConfigEntityBase; use DrupalCoreEntityEntityStorageInterface; use DrupalcontactCategoryInterface; ! /** * Defines the contact category entity. * * @ConfigEntityType( * id = "contact_category", * label = @Translation("Contact category"), * controllers = { * "access" = "DrupalcontactCategoryAccessController", * "list_builder" = "DrupalcontactCategoryListBuilder", * "form" = { * "add" = "DrupalcontactCategoryForm", * "edit" = "DrupalcontactCategoryForm", * "delete" = "DrupalcontactFormCategoryDeleteForm" * } * }, * config_prefix = "category", * admin_permission = "administer contact forms", * bundle_of = "contact_message", * entity_keys = { * "id" = "id", * "label" = "label" * }, * links = { * "delete-form" = "contact.category_delete", * "edit-form" = "contact.category_edit" * } * ) */ class Category extends ConfigEntityBase implements CategoryInterface {
  56. 56. class Category extends ConfigEntityBase implements CategoryInterface { ! /** * The category ID. * * @var string */ public $id; ! /** * The category label. * * @var string */ public $label; ! /** * List of recipient e-mail addresses. * * @var array */ public $recipients = array(); ! /** * An auto-reply message to send to the message author. * * @var string */ public $reply = ''; ! /** * Weight of this category (used for sorting). * * @var int */ public $weight = 0;
  57. 57. contact.category.personal.yml id: personal label: 'Personal contact form' recipients: { } reply: '' weight: 0 status: true uuid: 43155e41-8a58-4264-ab00-be97a0736aa0 langcode: en dependencies: { } ! ! $contact_category = $this->entityManager() ->getStorage('contact_category') ->load('personal'); ! $contact_category->label();
  58. 58. contact.category.personal.yml id: personal label: 'Personal contact form' recipients: { } reply: '' weight: 0 status: true uuid: 43155e41-8a58-4264-ab00-be97a0736aa0 langcode: en dependencies: { } ! ! $config = Drupal::config('contact.category.personal')->get(); $label = $config['label']; ! $label = Drupal::config(‘contact.category.personal')->get('label');
  59. 59. Drush • Full Drush integration available • Need Drush version 7.x • Currently in dev branch of Drush • List of Drush commands:
 http://www.drushcommands.com/drush-7x/config/ config-list
  60. 60. Drush Export config from the active configuration to the staging directory
 
 drush config-export
 
 drush cex
  61. 61. Drush Import the staging configuration into the active configuration
 
 drush config-import
 
 drush cim
  62. 62. Workflow • Staging config should become part of your codebase • New configuration changes should be exported and integrated into code base • Configuration in code should then be used to move configuration between servers
  63. 63. Dev Stage Live export deploy deploy import import Git Config Code Git Config Code Git Config Code Workflow
  64. 64. Dev Stage Live drush cex deploy deploy drush cim drush cim Git Config Code Git Config Code Git Config Code Drush Workflow
  65. 65. Roll Your Own Configurations ! ! ! ! Create a module that stores simple configurations
  66. 66. MyModule • A module that integrates with the configuration management API • Defines a single configuration item • Defines a page to display the configuration • Defines a form to change the configuration
  67. 67. MyModule Configuration • mymodule.info.yml file defines the module • mymodule.settings.yml contains the module configuration • mymodule.schema.yml contains information about the configuration item being defined • mymodule.routing.yml defines routes to a page and a form
  68. 68. name: 'MyModule' type: module description: 'My module' version: VERSION core: 8.x mymodule.info.yml
  69. 69. configitem: '' /config/install/mymodule.settings.yml
  70. 70. mymodule.settings: type: mapping label: 'My Module Settings' mapping: configitem: type: string label: 'A config item' /config/schema/mymodule.schema.yml
  71. 71. mymodule.page: path: '/mymodule' defaults: _content: 'DrupalmymoduleController MyModuleController::description' requirements: _access: 'TRUE' ! mymodule.admin: path: '/mymodule/edit' defaults: _form: 'DrupalmymoduleFormMyModuleAdminForm' requirements: _access: 'TRUE' mymodule.routing.yml
  72. 72. MyModule Page • mymodule.routing.yml defines the route to the page • Destination MyModuleController::description() loads the configuration and displays it
  73. 73. namespace DrupalmymoduleController; ! use DrupalCoreControllerControllerBase; ! /** * Custom page. */ class MyModuleController extends ControllerBase { ! /** * An example page. * * @return string * A render array containing some page content. */ public function description() { ! $mymodule_config = Drupal::config('mymodule.settings'); ! $output = array(); ! $output['mymodule_output'] = array( '#markup' => t('The value of configitem is "!configitem"', array('!configitem' => $mymodule_config->get('configitem'))) ); ! return $output; } } lib/Drupal/mymodule/Controller/MyModuleController.php
  74. 74. MyModule Form • mymodule.routing.yml defines the route to the form • Class MyModuleAdminForm defines a form that loads the configuration • Configuration is saved upon submission of the form
  75. 75. namespace DrupalmymoduleForm; ! use DrupalCoreFormConfigFormBase; ! /** * Configure MyModule admin settings for this site. */ class MyModuleAdminForm extends ConfigFormBase { ! /** * Implements DrupalCoreFormFormInterface::getFormID(). */ public function getFormID() { return 'mymodule_edit_form'; } ! /** * Implements DrupalCoreFormFormInterface::buildForm(). */ public function buildForm(array $form, array &$form_state) { $config = $this->configFactory()->get('mymodule.settings'); ! $form['configitem'] = array( '#type' => 'textfield', '#title' => t('Config Settings'), '#default_value' => $config->get('configitem') ); ! return parent::buildForm($form, $form_state); } ! /** * Implements DrupalCoreFormFormInterface::submitForm(). */ public function submitForm(array &$form, array &$form_state) { $config = $this->configFactory()->get('mymodule.settings'); ! $config->set('configitem', $form_state['values']['configitem'])->save(); ! parent::submitForm($form, $form_state); } } lib/Drupal/mymodule/Form/MyModuleAdminForm.php
  76. 76. ! /** * Implements DrupalCoreFormFormInterface::buildForm(). */ public function buildForm(array $form, array &$form_state) { $config = $this->configFactory()->get('mymodule.settings'); ! $form['configitem'] = array( '#type' => 'textfield', '#title' => t('Config Settings'), '#default_value' => $config->get('configitem') ); ! return parent::buildForm($form, $form_state); } lib/Drupal/mymodule/Form/MyModuleAdminForm.php
  77. 77. ! ! /** * Implements DrupalCoreFormFormInterface::submitForm(). */ public function submitForm(array &$form, array &$form_state) { $config = $this->configFactory()->get('mymodule.settings'); ! $config->set('configitem', $form_state['values']['configitem'])->save(); ! parent::submitForm($form, $form_state); } lib/Drupal/mymodule/Form/MyModuleAdminForm.php
  78. 78. configitem: 'another value'
  79. 79. Drupal 7 • Configuration management has been back ported into Drupal 7 • Configuration Management module 
 https://drupal.org/project/configuration
  80. 80. Resources • Creating Drupal 8.x modules
 https://drupal.org/developing/modules/8 ! • Configuration API in Drupal 8
 https://drupal.org/node/1667894 ! • Understanding Drupal 8's config entities
 http://www.previousnext.com.au/blog/understanding-drupal-8s-config-entities ! • Configuration schema/metadata
 https://drupal.org/node/1905070 ! • Configuration inspector for Drupal 8
 https://drupal.org/project/config_inspector
  81. 81. Drupal 8 CMI Needs You! • Lots of work still needs to be done on CMI • Go to http://drupal8cmi.org/ and pick an issue to work on
  82. 82. Me • Phil Norton (@philipnorton42) • #! code (www.hashbangcode.com) • Technical Lead at Access • Help run NWDUG

×