hkyss/evocms-extras
Extras for Evolution CMS (EVO CMS): a bundle of helper utilities and add-ons that extend the core with convenience functions, snippets, and integration tweaks. Install via Composer to add commonly needed features to your EVO projects without patching core files.
Architecture fit. This is a Laravel package that exposes HTTP endpoints for module lifecycle operations (notably Composer-driven installs) and now emits a standardized response envelope matching the wider qmedia-by package family: success responses as {"success": true, "data": ...}, refusals as {"success": false, "message": "...", "errors": {}}. This is a coherent direction — a single envelope across a package family removes per-package bespoke parsing in the consuming frontend/admin panel — but it is a wire-format contract change, not an internal refactor.
Integration feasibility. Feasible and low-effort if the set of consumers is small and in-repo. The migration is mechanical: any client reading errors.message must read top-level message instead, and any client treating errors as absent-on-success or as a message container must be adjusted. The subtle trap is errors being an empty object ({}) rather than an empty array or omitted key — PHP's default json_encode([]) yields [], so the package is deliberately casting, and consumers doing Object.keys(errors).length or destructuring will behave differently than Array.isArray(errors) expectations.
Technical risk.
"^1.6" and an unpinned lockfile picks this up silently on composer update. This is the single largest risk in the release.errors.message will render undefined on refusal rather than throwing — installs will appear to fail with no explanation, which is the worst failure mode for an install tool.data. Composer output routinely contains absolute filesystem paths, package/VCS URLs (occasionally with embedded credentials), and dependency resolution detail. That is now serialized into an HTTP response and likely into browser devtools, client logs, and any telemetry that captures response bodies.success flag; if refusals now return HTTP 200 with success: false, existing retry/alerting logic keyed on 4xx/5xx will regress. Unverified from the notes.Key questions.
success now the sole signal?errors ever populated (field-level validation), or always {}? Determines whether consumers can drop it entirely.data? What is the maximum response size for a failed install with a deep dependency tree?qmedia-by envelope documented anywhere normative, so we can contract-test against it rather than against observations?Stack fit. Standard Laravel package: Composer install, service provider registration, config publish, HTTP routes. The Composer-execution nature of the install endpoints means long-running, non-idempotent, side-effecting operations behind a synchronous HTTP call — verify whether installs are queued or executed inline before sizing the integration.
Migration path. Treat this as a contract migration, not a dependency bump:
errors.message, errors, .data access patterns) across frontend, admin panel, CLI wrappers, and any partner integration.const msg = res.message ?? res.errors?.message ?? 'Unknown error'. Deploy this before bumping the package, so the ordering is safe in both directions.^1.6 on any environment with consumers not yet updated.success, message, errors is an object, data on failure contains notes).errors.message reads.Compatibility. The change is internally compatible — it aligns this package with siblings in the qmedia-by family, reducing long-term per-package parsing. That benefit is real but deferred; the cost is paid now by existing consumers. No database migration or config change is implied by the notes, so rollback is a version pin away, provided installs are not stateful mid-flight.
Sequencing. Tolerant reader → pin → bump → contract tests → shim removal. In parallel, confirm the status-code behavior and the data-on-failure payload limits before user-facing rollout, since both affect support load more than the envelope rename itself.
Maintenance. Envelope churn inside patch releases materially raises maintenance cost: consumers must effectively track this package's response shape on every composer update. Mitigate with a pinned version constraint, a committed contract test asserting the envelope, and a standing request to the maintainer that wire-format changes carry a major or minor bump with a changelog note.
Support. Expect a specific, recognizable ticket pattern: "install failed and the UI showed nothing / showed 'undefined'." Support runbooks should include the check "is the client reading message or the legacy errors.message?" until propagation is confirmed. Also expect questions about the raw Composer text now surfaced under data on failures — decide in advance whether that output is user-visible or gated behind a debug flag.
Scaling. Two concerns. First, response size: failed installs now embed installer notes plus Composer's full output, which for a large dependency graph can be tens of kilobytes and is unbounded in principle. Confirm truncation. Second, the operations themselves are Composer installs — CPU/IO-heavy and network-bound. If they run inline in a web request they will hit PHP max_execution_time and gateway timeouts under concurrency; if queued, the envelope must model "accepted/queued" as distinct from "succeeded." The notes don't clarify which model applies, and that is the difference between a tool that scales and one that times out.
Failure modes.
errors.message, gets undefined, reports nothing useful. Highest-likelihood, highest-visibility.errors as array or as absent; {} truthiness and iteration surprise.data now carries the notes that would tell you.Ramp-up. Low for any Laravel developer to consume the package; the learning cost is in the convention, not the code. New joiners need the qmedia-by envelope documented once (success shape, refusal shape, errors semantics, what data may contain on success vs failure) or each package will be reverse-engineered individually. Budget roughly half a day for the consumer inventory and shim, and treat the contract test as the durable artifact that prevents this migration from recurring on the next patch release.
How can I help you explore Laravel packages today?