emange/list-field_type
A Laravel/PHP field type add-on for the Streams Platform that adds configurable list fields to forms and models. It makes it easy to define, store, validate, and render ordered options or values in PyroCMS/Streams-based applications, with a lightweight setup and straightforward Composer installation...
Architecture fit. emange/list-field_type follows the Streams Platform (*_field_type) addon convention used by PyroCMS 3, so it is designed to plug into the addon/field-type registry rather than into application code directly. Its stated purpose — storing an array of text/textarea values in a single column without provisioning a dedicated stream — is a legitimate architectural trade: it collapses a one-to-many child stream into a serialized column on the parent entry. That is a good fit for low-cardinality, presentation-oriented data (bullet lists, spec tables, contact blocks, FAQ snippets) and a poor fit for anything that needs to be queried, sorted, filtered, reported on, or referenced from elsewhere. Treat it as a content-authoring convenience, not a data-modelling primitive.
Integration feasibility. Mechanically low effort: add a VCS repository entry to composer.json, require the package, ensure the addon is discovered/registered, then create a field of this type on an existing stream. No core patching is implied. The real cost is verification, not wiring — the package is distributed via Bitbucket with no visible release history, no star signal, and zero dependents, so there is no community evidence of it working against any specific Streams Platform version. Budget a spike to read the field type class, its getView()/modifier/accessor logic, its $columnType, and its validation rules before committing.
Technical risk. Several risks are inherent to this class of addon, independent of code quality:
serialize/unserialize on database content is a deserialization risk if any write path is untrusted, and is brittle across class changes. Confirm JSON encoding and a safe decode path with a sane fallback on malformed data.Key questions.
Stack fit. Only relevant if the target is a Laravel application running PyroCMS 3 / Streams Platform. It is not a general-purpose Laravel package and offers nothing to a vanilla Laravel, Filament, Nova, or Livewire stack — in those environments an equivalent is a JSON cast plus a repeater form component, which is a few hours of work and fully owned. Confirm the platform dependency before anything else; if the answer is "we are on PyroCMS 2 or a custom Laravel app," close the evaluation.
Migration path. There is no migration from an existing solution unless one already exists; the realistic path is into and out of this addon. Inbound: create the field on a non-critical stream, populate, and verify round-t rip fidelity (multi-line text, quotes, unicode, empty items, reordering). Outbound: if the requirement hardens into relational data, you will need a script that reads each entry's serialized value and writes rows into a real stream/table, then a template change and a field-type swap. Design the content model now so that swap stays a contained exercise.
Compatibility. Pin to a commit SHA rather than a branch, and record the exact platform and PHP versions validated during the spike. Because the package is installed from a VCS source, Composer will not protect you with constraint resolution; the pin is your compatibility guarantee. Verify addon discovery works with the project's addon path configuration and that no autoload or service-provider conflict appears alongside other field-type addons.
Sequencing.
Maintenance. Near-zero upstream maintenance is likely — no stars, no dependents, no evidence of an active release cadence. Plan for the package to be frozen. That means owning it: mirror the repository internally, pin the commit, and accept that any fix on a platform or PHP upgrade is yours to write. Budget a small annual allowance for that, or budget the one-off cost of replacing it with in-house code and avoid the dependency entirely.
Support. No vendor, no community, no issue-tracker signal. Internal documentation of the field type's behaviour, storage format, and known limitations is mandatory if more than one developer will touch content modelling. Content editors will also need guidance, because a list field invites arbitrary structure — inconsistent item counts and shapes across entries are the predictable outcome.
Scaling. Fine for read-heavy, low-cardinality, entry-scoped data at modest volumes. Degrades on three axes: (a) row size — long textarea lists bloat the entries table and slow full-row selects; (b) query needs — any filtering, sorting, search, export, or API projection over inner items requires application-side parsing; (c) edit concurrency — a serialized column is a whole-value write, so two editors saving the same entry will clobber each other's items with no per-item merge. There is also no referential integrity: nothing prevents a value that points at a deleted record.
Failure modes. Ranked by likelihood and blast radius: malformed or truncated serialized data causing a decode error and a broken entry render; unescaped output producing stored XSS in the control panel; a platform or PHP upgrade breaking the addon's class contract and taking every stream using the field type down at once (a shared failure surface — one bad field type is a fleet-wide risk); a Composer update pulling an unpinned branch and changing behaviour silently; and content-model drift where editors overload the field with data that later must be migrated. Mitigate with a pinned commit, a decode fallback, escaping review, a backup taken before first use, and a documented "do not use for relational data" rule.
Ramp-up. Low for developers — the addon surface is small and installation is a Composer entry plus a field definition, roughly half a day including verification. Low for editors — the UI is a repeatable text input, self-explanatory. The genuine ramp-up cost sits with whoever owns the content model: they must internalize the boundary between "list-shaped presentation data" and "relational data that belongs in a stream," because that judgement is what keeps this dependency cheap. Overall recommendation: viable as a small, pinned, internally-mirrored convenience in a PyroCMS 3 codebase; not viable as a strategic dependency, and not worth adopting at all outside that platform.
How can I help you explore Laravel packages today?