Core: Fields
Field handles, rules, shorthands, and registered types from core.php.
Fields define entry attributes on a stream. Each field has a handle, type, and optional validation, defaults, and UI input config.
Definition formats
Shorthand map:
{
"fields": {
"title": "string",
"published": "boolean"
}
}
Full object (list form):
{
"fields": [
{
"handle": "slug",
"type": "slug",
"required": true,
"unique": true,
"rules": ["alpha_dash"],
"protected": false
}
]
}
Import: the whole fields value, or any one field, can be "@path/to/file.json". Core replaces it with the decoded JSON file (relative to the app root) when it builds the stream:
{
"fields": {
"title": "string",
"seo": "@streams/fields/seo.json"
}
}
Common field options
| Option | Purpose |
|---|---|
required |
Adds required validation rule |
unique |
Unique within stream (via StreamsPresenceVerifier) |
rules |
Additional Laravel validation rules |
protected |
Omit from toArray() / toJson() |
config.default |
Default value via factory |
input |
Admin UI hints (used by Streams UI) |
Registered types
From config/streams/core.php field_types:
| Category | Types |
|---|---|
| Numbers | number, integer, decimal |
| Strings | string, url, uuid, hash, slug, email, encrypted |
| Boolean | boolean |
| Dates | datetime, date, time |
| Selection | enum, select, multiselect |
| Structured | array, object |
| Relations | relationship, polymorphic |
| Media | file, image |
| Other | color |
enum is an alias of select. There is no text, textarea, markdown, html, or multiple type. Use string with an input hint (for example {"type": "textarea"}) for long content, multiselect for several options, and "multiple": true in a relationship's config for several related entries.
Type-specific config
These are the config keys Core reads. Put them inside config, never next to type.
| Type | Key | Meaning |
|---|---|---|
relationship |
related (required) |
Related stream ID |
relationship |
multiple, key_name, relation |
Store a list of keys; related key field (default id); relation name for eager loading (default: handle without _id) |
select, enum, multiselect |
options (required) |
Object of value => label, or a list of values |
array |
items |
List of allowed item types, each {"type": "..."}; enforce_items: false skips the check |
array |
stream, related |
Cast items to entries of a stream (ID or inline definition) or look them up by key |
array, object |
wrapper |
Class used to wrap the value |
object |
allowed |
List of {"stream": ...}, {"generic": ...}, or {"prototype": ...} objects |
polymorphic |
related |
Optional list of expected stream IDs (not enforced) |
uuid |
default: true |
Generate a UUID when missing |
slug |
separator |
Word separator (default -) |
decimal |
precision |
Decimal places |
date, datetime, time |
format, timezone |
Storage format; timezone (default app.timezone) |
color |
format |
Default decorator output (hex) |
Examples of every type are in Field types. The stream definition schema checks these shapes.
Accessing values
$entry->title;
$entry->setAttribute('title', 'Hello');
$entry->decorate('body'); // formatted output