juststeveking/parameterbag
A simple, framework-agnostic parameter bag for PHP. Wrap arrays of data in a typed object and access, validate, and manipulate values through a clean, readable API—ideal for request parameters, configuration, or DTO-style payloads.
What a TPM is actually evaluating. Not "should we use this library" in the abstract, but "is this a lever I can pull in a program plan?" The package is a ~100-line value object wrapping an associative array with get/set/has/all, dot-notation nesting, defaults, ArrayAccess, and iteration. It is framework-agnostic, dependency-free, and does nothing else. That narrowness is the point: it is a convention with a class attached, not infrastructure. A TPM should evaluate it as a coding-standard decision with a small procurement step, not as a platform commitment — which is exactly why it can be adopted cheaply and dropped cheaply.
Architecture fit. Well-scoped for its job. It converts "loose associative array threaded through four layers" into a named type with a predictable surface, which is a genuine program-level win in codebases where payload shape is tribal knowledge. It has no service provider contract to satisfy, no persistence, no queue or HTTP coupling, and does not touch the request path. In a Laravel codebase it sits alongside Collection, Config\Repository, and Symfony's ParameterBag rather than replacing them — so the architectural question a TPM must force is "which of these are we standardising on, and why is this the one?" If the team cannot answer in one sentence, the program gains a fourth overlapping primitive and loses the readability payoff entirely.
Integration feasibility. Genuinely one line for a PHP 8.0+ application: composer require juststeveking/parameterbag:^2.0, then use it. No migration tooling, no config publishing, no artifact. The feasibility risk is not the integration, it is the resolution: verify composer update --dry-run against the application's actual Laravel version before putting a date on a plan. If the 2.0.0 require block pins illuminate/* to a Laravel 8/9-era range, the "one-line install" becomes a dependency-archaeology spike, and that changes the schedule. On PHP 7.4 the package is blocked outright — but PHP 7.4 and 8.0 are both end-of-life, so that block is really a runtime-modernisation program item that should be sequenced and justified on its own merits, never smuggled in on the back of a utility package.
Technical risk.
mixed. The package relocates the "what is in this array" problem into a class; it does not solve it. If the underlying requirement is validated or typed structure, this is the wrong tool and the misread is the most common cause of a failed adoption.Key questions.
require block say about php and illuminate/*, and does it resolve cleanly against our Laravel version today?Stack fit. Good, with one caveat worth stating in the plan. Framework-agnostic, dependency-light, Laravel-friendly, and aligned with the ecosystem's PHP 8.0+/Pest direction. The caveat is duplication: Laravel already ships Collection for keyed data, Config\Repository for config-shaped bags, and Symfony's ParameterBag for request parameters. A TPM should not sponsor adoption until the team can articulate the gap. Where the gap does exist — domain value objects (money, address, pagination params), validated request/config bundles, job/command arguments, third-party API payloads, test fixtures — this is a clean, low-ceremony fit.
Migration path. Two populations, and they are different programs:
^2.0, convert one seam that currently passes an array, write one test, observe. Hours, not days. Schedule it as a background maintainability task inside an existing sprint.Compatibility. Do not accept the release note's PHP floor as a compatibility statement. Build the matrix empirically: run composer update --dry-run against each Laravel version in the estate and record what resolves. Since Laravel 10 requires PHP 8.1+ and Laravel 11+ requires 8.2+, the package's effective reach is bounded by its illuminate/* constraint, not its php constraint. Write the result down — the next person will assume "PHP 8.0+" means "works everywhere," and that assumption is how a green build becomes an outage.
Sequencing.
composer why-not if it fights, confirm the public API matches the description. Output is a go/no-go memo, not code in main.^2.0. Do not float. On a package this quiet, floating buys nothing and destroys your ability to reason about what is installed.Maintenance. Effectively zero runtime maintenance: no migrations, no scheduled jobs, no outbound calls, no config to drift, no data to backfill. The burden is ownership rather than operations. If a PHP 8.4 or Laravel 12 compatibility patch is ever needed, the team will almost certainly write it. Budget that as a known, small, date-unbounded item — a line in the maintenance forecast, not a surprise in a quarterly review.
Support. No published support policy, no visible security process, unknown maintainer availability. For a package this size the practical answer is "self-support," which is acceptable only if the team has explicitly accepted it in writing. Record the acceptance now; it prevents an incident review from rediscovering it as a governance failure later, when the person who made the call has moved on.
Scaling. Trivial and irrelevant in the usual sense — no throughput, no concurrency, no storage. The scaling question that matters is codebase scale: how many seams adopt the convention, and does the convention stay coherent as adoption spreads? Cap it deliberately. Use it at explicit boundaries (payload ingress, config bundles, fixtures) rather than everywhere an array appears, or the codebase acquires an untyped container idiom that a future DTO migration has to unwind. That unwind cost is the real scaling risk, and it is a design-governance item a TPM can actually control.
Failure modes.
Ramp-up. Near zero for any PHP developer who has used ArrayAccess: one short read of the class, one example, done. The ramp-up cost that actually matters is convention ramp-up — teaching the team when to reach for the bag versus a DTO versus a Collection. That is a 30-minute engineering-standard note plus one exemplary PR, and it is the difference between a targeted readability win and a codebase-wide idiom sprawl. Assign it to whoever owns the adoption; unowned conventions do not survive their first sprint boundary.
Program framing for stakeholders. This carries no customer-visible capability and no revenue lever. The business case is modest and indirect — cleaner internal contracts, marginally lower defect and onboarding cost in the modules that adopt it, and a one-file seam where payload shapes absorb partner API changes. Low stakes in both directions: a small refactor with a small payoff. The one item to flag upward is dependency posture — one maintainer, zero known dependents, no release since mid-2021 — and the corresponding decision to adopt selectively, off critical paths, pinned, wrapped, and owned.
How can I help you explore Laravel packages today?