Input System - Defining Inputs
When to Use
Use inputs when you need to externalize site-specific data that varies per environment, making recipes portable and reusable.
Define user-provided values that vary per environment. Inputs enable recipe portability by externalizing site-specific data.
Steps: Define Inputs, Types, Constraints, Prompts and Forms
-
Define input structure — Each input requires description, data_type, default
input: site_name: description: 'The name of the site' data_type: string default: source: value value: 'My Site' -
Specify data type — Only primitive types supported
input: enable_feature: description: 'Enable experimental feature' data_type: boolean default: { source: value, value: false } cache_lifetime: description: 'Cache lifetime in seconds' data_type: integer default: { source: value, value: 3600 } -
Add constraints — Validate input values using Symfony constraints
input: admin_email: description: 'Administrator email address' data_type: string constraints: Email: ~ default: { source: value, value: 'admin@example.com' } -
Configure CLI prompts — Control how inputs are collected interactively
input: site_name: description: 'Site name' data_type: string prompt: method: ask arguments: question: 'What is your site name?' default: { source: value, value: 'Default Site' } -
Configure form elements — Define Form API properties for web forms
input: site_name: description: 'Site name' data_type: string form: '#title': 'Site name' '#required': true default: { source: value, value: 'My Site' }
Decision Points: Choosing a Default Source
| At this step... | If... | Then... |
|---|---|---|
| Value varies per environment | Different staging/prod values | Use source: env with environment variable |
| Value comes from existing config | Recipe extends existing site | Use source: config with config path |
| Value is fixed | All sites use same value | Use source: value with literal value |
| Validation needed | Input format matters | Add constraints using Symfony validators |
Common Mistakes
- Using complex data types → Only primitives (string, integer, boolean, float) supported; no arrays or objects
- Forgetting default is required → Every input must have default source defined; no default = validation error
- Not validating inputs → Add constraints for format validation (email, URL, regex patterns)
- Assuming inputs persist → Inputs are apply-time only; not stored in config after recipe runs
- Using Form API child elements in form definition → Inputs are primitives; no child elements allowed
See Also
- Previous: ← Config Actions - Advanced Patterns
- Next: Input System - Default Sources →
- Reference:
core/lib/Drupal/Core/Recipe/InputConfigurator.php