Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Core Bundle Laravel Package

smartbox/core-bundle

Core bundle for Smartbox Laravel applications, providing shared services, utilities, and integrations to standardize common functionality across projects. Extend and configure core components quickly while keeping your codebase consistent and maintainable.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Framing correction (unchanged, still blocking): smartbox/core-bundle is a Symfony bundle, not a Laravel package. The -bundle suffix, Smartbox Group provenance, and Symfony bundle layout point to kernel integration (Bundle class, DependencyInjection/*Extension, config tree). v1.8.0 does not change this — a JMS Serializer visitor is registered through Symfony's DI/compiler-pass machinery, reinforcing it.

Architecture fit — low, now slightly better characterised. The v1.8.0 note is the most informative artifact we have: it tells us the bundle (a) depends on JMS Serializer as a first-class integration, and (b) carries custom serializer visitors, i.e. it customises the serialization/deserialization pipeline rather than merely providing domain services. That is a deeper integration point than a plain service library: visitors hook into graph navigation and are sensitive to the serializer's internal API. Consequences: (a) Laravel remains a poor fit — no JMS Serializer convention exists there, and a visitor is not portable to Laravel's serialization stack; (b) on Symfony, fit is plausible but the integration surface is now known to include serializer internals, which are the most version-sensitive part of the stack (JMS Serializer 1.x/2.x → 3.x changed namespaces, attribute handling, and visitor/graph APIs).

Integration feasibility — still gated on constraints, now with a second constraint axis. Composer resolution must satisfy both Symfony and JMS Serializer. The fact that a new visitor is being added in v1.8.0 tells us the package is actively developed against some JMS Serializer line, but not which. Two readings, and they point in opposite directions:

  • Optimistic: upstream is alive, is targeting a current serializer, and the previously assumed PHP 7.2–7.4 / Symfony 4.4–5.x ceiling may have moved.
  • Pessimistic (more likely given a 2020-05-11 predecessor): this is a feature shipped on the existing legacy line — i.e. the custom visitor was written against an EOL JMS Serializer, which would confirm rather than refute the modernization burden.

Determining which is a composer.json read, not a spike: check the jms/serializer constraint, the php constraint, and the Symfony majors. composer require --dry-run still answers the go/no-go cheaply.

Technical risk — high, with two revisions:

  • "Unmaintained" is now wrong; "single-maintainer, unreviewable cadence" is right. A release landed, so there is a pulse. But the note is one sentence, names no version, no migration path, no tests, no linked PR — and the release is a feature, not a compatibility fix. Nothing indicates PHP 8.4 or Symfony 7 readiness. Replace "five years silent" with "one narrow feature since 2020," which is still not a support relationship.
  • New named transitive dependency: JMS Serializer. This was previously only suspected under "transitive dependency debt"; it is now concrete and, importantly, it is a deep dependency. JMS Serializer version skew is a well-known source of breakage, and any custom visitor is the part most likely to break on serializer upgrades. If we fork, we inherit responsibility for a visitor written against an API we did not choose.
  • Serializer-layer coupling is a behavioural risk, not just a build risk. A "plain text deserialization" visitor implies the bundle accepts loosely-typed input and coerces it into domain objects. That is exactly the code path where silent coercions, null/empty-string handling, and type-juggling edge cases live — and where input-validation assumptions should be audited before anything touches production data.
  • Unchanged: zero ecosystem signal (0 stars/dependents means no bug corpus, no third-party patches, no disclosure history; "unused" vs "all consumers private" is still unknowable), hidden coupling to internal Smartbox services, unverified test coverage, and MIT licensing that warrants an audit of bundled assets.

Key questions — revised, one new:

  1. Is our target stack Laravel or Symfony? If Laravel, stop; treat as reference only.
  2. What does composer.json say now — php constraint, Symfony majors, and which jms/serializer major? Does v1.8.0 raise any of these, or only add a class?
  3. Is the new visitor compatible with the JMS Serializer version we would run (3.x/current), or does it pin us to an EOL line?
  4. What is actually in src/? Enumerate the public API and the capabilities we would consume. Does the serializer customization matter to us at all, or is it incidental to the parts we want?
  5. Does it require private/internal Smartbox packages, endpoints, or credentials? If yes, not installable.
  6. Does the new release include tests for the visitor, and does CI pass on a modern runtime? A visitor with no test is a fork liability.
  7. Who maintains upstream, and is there a named successor package or active fork?

Provisional verdict — softened from "do not adopt," not cleared. The prior verdict rested partly on abandonment; that leg is weakened. The remaining legs are intact: no support relationship, no ecosystem signal, deep serializer coupling, and unknown runtime compatibility. Verdict becomes: do not adopt as a third-party dependency without a constraint check, and even then the realistic path remains fork-and-own. Re-run the go/no-go as a composer.json read (hours), not a fresh evaluation.

Integration Approach

Stack fit. Decision tree unchanged: Laravel → no integration path worth building (mine for domain patterns only). Symfony 5.4 LTS on PHP 8.1 → conditional trial, and the new visitor must be exercised explicitly. Symfony 6/7 → assume incompatible until a fork proves otherwise. Add: if we do want the serializer behaviour, note we may be able to reimplement a plain-text visitor natively in far less code than adopting the bundle — a small, contained piece of logic is a poor reason to take the whole dependency.

Migration path. Still net-new adoption, so the risk is exit risk. Unchanged and now more important given deep serializer coupling:

  • Wrap every touchpoint behind our own interfaces (ports/adapters). Domain code must never reference bundle types, entities, DTOs, or serializer visitors.
  • Keep the bundle's service definitions and any serializer visitor registration confined to one container extension/config file so it can be excised by deleting one file.
  • Never let bundle exceptions, enums, or value objects leak into our public contracts.
  • Treat the serializer customisation as a boundary concern: our own validation and typing should not depend on the visitor's coercion rules.

Compatibility.

  • Read composer.json first: php, symfony/*, jms/serializer. This is now the single highest-value artifact.
  • Run composer require --dry-run and composer why-not smartbox/core-bundle <version> against our real root composer.json; capture the lockfile diff — pay attention to which JMS Serializer major the solver picks.
  • Test against the oldest runtime we support first (highest chance of passing), then step up; the delta sizes the fork cost.
  • New: write a round-trip test for the plain-text visitor specifically — plain-text payload with null, empty string, numeric-coerced-to-string, and malformed input — before trusting it on any real data path.
  • PHPStan/Psalm plus a deprecation audit on the target runtime; deprecation count is a proxy for fork cost.
  • Audit transitives (now including JMS Serializer and its own tree) for abandonment and advisories.

Sequencing (timeboxed, fail-fast):

  1. Constraint read — composer.json, license, bundled-asset audit. Hours, not days. Do this before anything else now; the release makes it cheaper than the prior plan assumed.
  2. Source and API review — enumerate public API, note what the serializer visitor actually enables, map to capabilities we need. Days.
  3. Throwaway spike — install in a skeleton app, exercise the exact API we would consume, including the visitor round-trip. Hard timebox: a few days, then decide.
  4. Fork decision — only if an irreplaceable capability surfaces. Fork into our org, take explicit ownership, do not plan to re-sync.
  5. Harden the fork — CI matrix over our PHP/Symfony range, relaxed constraints, tests backfilled around the behaviours we rely on (start with the visitor).
  6. Integrate behind the anti-corruption layer, wired into product code last.
  7. Instrument — logging/metrics at the ACL boundary, and specifically at the deserialization boundary.

If step 1 or 3 fails, close the initiative and record the finding. Stopping now costs hours to days.

Operational Impact

Maintenance. Effective ownership still transfers to us in practice, but the characterisation changes from "abandoned" to "single-track upstream." A release exists, so there is someone; there is still no published support commitment, no cadence, no LTS statement, and no evidence of compatibility engineering (the release is a feature, not a PHP/Symfony upgrade). Assume our upgrade cycle is not on their roadmap. Budget the same fork-and-modernize effort — constraint relaxation, deprecation fixes, CI, test backfill — but with a new line item: ownership of a JMS Serializer visitor written against an API we did not choose, which must be re-validated at every serializer upgrade. Recurring tax at each framework and serializer upgrade cycle.

Support. Unchanged and still the dominant red flag. No SLA, no maintainer responsiveness commitment, one-sentence release notes with no migration guidance, documentation no deeper than a README. A single recent release does not constitute an escalation path. Bus factor remains effectively one, and that one is outside our organisation. Under incident pressure, the remediation path is still "our engineers read PHP they did not write."

Scaling. Unknown, must be measured. Two hot spots to watch, one new: inherited Smartbox data-access/caching assumptions (N+1 patterns in pricing/availability logic, synchronous remote calls, cache invalidation cadence tuned to their traffic), and now deserialization throughput — plain-text coercion in a visitor is per-payload CPU work on whatever path consumes it. Load-test that path explicitly if it sits anywhere near request handling.

Failure modes, ranked by likelihood:

  1. Lifecycle block (most likely). A PHP or Symfony upgrade — or a JMS Serializer 3.x migration — is gated by the bundle's constraints, forcing an unplanned fork under deadline pressure. This now has two triggers instead of one, so it is more likely than previously assessed.
  2. Serializer API drift. A visitor written against an older JMS Serializer breaks on upgrade in non-obvious ways (wrong coercion, silent nulls, exceptions at graph-walk time). Manifests as data-shape bugs, not build errors — harder to catch.
  3. Silent drift from upstream. Any local patch diverges the fork. Mitigate by never planning to re-sync and documenting the fork as a permanent internal component.
  4. Transitive CVE. An advisory in an abandoned dependency we cannot replace without unbounded work.
  5. Hidden coupling to internal Smartbox services — opaque runtime failures and long incidents.
  6. Behavioural surprises. Undocumented business logic (rounding, tax, availability edge cases, plain-text coercion rules) discovered in production rather than tests.

Ramp-up. Engineers must read compiler passes, a config tree, and now a JMS Serializer visitor, plus whatever domain logic is encoded. Estimate 1–2 days for a senior Symfony developer to form a credible opinion during the spike; longer to become productive editing it. No tutorial corpus; onboarding is paid in source reading. Plan for the two engineers who do the spike to be the owners — knowledge will not distribute itself across a team with no documentation.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
cgv/localized-resource