{"componentChunkName":"component---src-templates-post-jsx","path":"/en/config-api-vs-state-api","result":{"data":{"markdownRemark":{"html":"<p>The need to share configurations across environments in a Drupal project is a recurring requirement. The Features module used to allow developers to share various configurations between development and production environments in Drupal 7. Features was one of the most widely used and essential modules due to its flexibility and effectiveness. This drove the community to introduce a Configuration and Synchronization API directly into Drupal 8 Core.</p>\n<p>Here is a simple Configuration API usage scenario:</p>\n<ul>\n<li>A new content type and the necessary fields are created during the development of a new feature.</li>\n<li>Once the feature is implemented in the development environment, configurations can be exported from the database via the command <code class=\"language-text\">drush config-export</code> in <code class=\"language-text\">.yml</code> file format, which are then versioned using git and later imported to another environment via <code class=\"language-text\">drush config-import</code>.</li>\n</ul>\n<h3>Using the Configuration Management API</h3>\n<ul>\n<li>\n<p>Get a value from configuration:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$slogan</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'system.site'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'slogan'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Save a value in configuration: </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$slogan</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'system.site'</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'slogan'</span><span class=\"token punctuation\">,</span><span class=\"token single-quoted-string string\">'value'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>State API</h2>\n</li>\n</ul>\n<p>The State API allows storing environment-specific information. In other words, the goal is to keep certain information that is specific to each environment — the simplest example being recording the last time Cron ran. This information depends on each environment, so it must be stored in State.\nThe concept of a State API exists in most frameworks under different names (\"envs-variables\", \"sys-vars\"...) but the idea is the same.</p>\n<h3>Interacting with State API</h3>\n<ul>\n<li>\n<p>Get a value:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$value</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'key'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Get multiple key/value pairs:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$values</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getMultiple</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$keys</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Save a value:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">\\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'key'</span><span class=\"token punctuation\">,</span><span class=\"token single-quoted-string string\">'value'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Save multiple values:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">\\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">setMultiple</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$keyvalues</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Delete a value:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">\\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">delete</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'key'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<p>Delete multiple values:  </p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">\\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">state</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">deleteMultiple</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$keys</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h2>Conclusion</h2>\n<p>Both APIs allow storing data. The table below summarizes the key differences between the two.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th align=\"center\">Configuration API</th>\n<th align=\"center\">State API</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Data can be shared across environments</td>\n<td align=\"center\">✅</td>\n<td align=\"center\">❌</td>\n</tr>\n<tr>\n<td>Data can be modified by users</td>\n<td align=\"center\">✅</td>\n<td align=\"center\">❌</td>\n</tr>\n<tr>\n<td>The API is used to store system state information</td>\n<td align=\"center\">❌</td>\n<td align=\"center\">✅</td>\n</tr>\n</tbody>\n</table>","excerpt":"The need to share configurations across environments in a Drupal project is a recurring requirement. The Features module used to allow developers to share…","frontmatter":{"date":"2020-06-06","metaDate":"2020-06-06","title":"Configuration API vs State API","tags":["Drupal 8","Drupal 9","Backend","Configuration","State"],"path":"/config-api-vs-state-api","cover":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgT/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgME/9oADAMBAAIQAxAAAAFyLI1TgzDH/8QAGRAAAwEBAQAAAAAAAAAAAAAAAAECIQMi/9oACAEBAAEFAjq/MVjZewf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAADAQEAAAAAAAAAAAAAAAAAARAhEf/aAAgBAQAGPwIx8Ncc/8QAGBABAQEBAQAAAAAAAAAAAAAAAQARUWH/2gAIAQEAAT8hki9PMay1cYv/2gAMAwEAAgADAAAAEAwf/8QAFhEBAQEAAAAAAAAAAAAAAAAAARBB/9oACAEDAQE/EA2f/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAECAQE/ENR//8QAHBAAAwEAAgMAAAAAAAAAAAAAAREhADFBUWHR/9oACAEBAAE/EOvGGAOOrv1kQ1HZuIEClpCAgD7im//Z","aspectRatio":1.5,"src":"/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/88110/explaining.jpg","srcSet":"/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/0b320/explaining.jpg 480w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/60b32/explaining.jpg 960w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/88110/explaining.jpg 1920w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/40175/explaining.jpg 2880w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/75970/explaining.jpg 3000w","srcWebp":"/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/d1a9d/explaining.webp","srcSetWebp":"/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/bc3bf/explaining.webp 480w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/39337/explaining.webp 960w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/d1a9d/explaining.webp 1920w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/fcbe1/explaining.webp 2880w,\n/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/d4a49/explaining.webp 3000w","sizes":"(max-width: 1920px) 100vw, 1920px"},"resize":{"src":"/static/bbd8e98ea8d7290a5fb8c31bbabfbd67/c4f3a/explaining.jpg"}}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"pathSlug":"/config-api-vs-state-api","locale":"en","prev":{"fields":{"locale":"en"},"frontmatter":{"path":"/getting-ready-for-drupal9","title":"Getting Ready for Drupal 9","tags":["Drupal 8","Drupal 9","Performance","Update"]}},"next":{"fields":{"locale":"en"},"frontmatter":{"path":"/middleware-api","title":"Middleware API","tags":["Drupal 9","Core feature","Performance","Module development"]}}}}}