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

Ting Bundle Laravel Package

xavierleune/ting_bundle

A Symfony bundle that packages Ting integration for PHP projects, providing bundle configuration and service wiring to help developers add Ting functionality to Symfony applications with minimal setup. A small, straightforward package for projects that need Ting support.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Framing correction (read first): xavierleune/ting_bundle 4.0 is a Symfony bundle, not a Laravel package. It has no service provider, no facade, no Eloquent integration, and no config/app.php registration path — it registers through Symfony Flex / config/bundles.php and consumes the Symfony kernel, DI container, routing, profiler, cache pools, and security user providers. Any assessment of "how a TPM leverages this in a Laravel stack" resolves to: you don't, unless a distinct Symfony service exists in the estate. For a Laravel-only portfolio the correct disposition is "no action, do not adopt"; the remainder of this assessment assumes a Symfony 7.x/8 application (or a mixed estate with a Symfony component) is in scope.

Architecture fit

  • Ting is a data-mapper ORM with a unit of work, not an Active Record ORM. It maps plain PHP objects via #[Table]/#[Column] attributes and resolves repositories as services. This is a good fit for domain-modeled Symfony apps and a poor fit for teams whose mental model is Eloquent/Doctrine annotations-by-convention.
  • Attribute-based mapping plus build-time validation (union-typed or untyped #[Column], missing connection/database/repository all fail container build with an error naming the entity) is an architectural positive: misconfiguration surfaces at deploy-time compile, not at first query in production.
  • default_connection / default_database reduce per-entity boilerplate and centralize environment configuration — good for multi-tenant and multi-database estates.
  • Worker-mode readiness (repositories, connection pool, unit of work, loggers, collectors reset between requests under FrankenPHP/RoadRunner) is the single most architecturally significant item here. It is a prerequisite for long-running runtimes, not a nice-to-have.
  • Coupling risk: the bundle is a thin layer over xavierleune/ting; most breaking changes ride in from Ting 4. Version-skew between bundle and core is the primary architectural hazard.

Integration feasibility

  • Low mechanical effort, high verification effort. composer require xavierleune/ting_bundle:^4.0 plus a ~3-line YAML block. The cost is in the breaking-change surface, dominated by one item: backed enum storage changed (4.x stores the enum's value; 3.x stored JSON-encoded values). That is a data migration, not a code migration, and it is the gating workstream.
  • Platform floors: PHP 8.2 (8.4 required for Symfony 8), Symfony ^7.4 || ^8.0. This forces a Symfony minor upgrade as a precondition — i.e., two upgrades sequenced, not one.
  • UniqueEntity now accepts named arguments only — a silent-ish break that will surface as container/compile errors or test failures depending on usage breadth.
  • master/slaves → primary/replicas fails loudly with a message naming the new keys. Good failure mode; trivial fix; but it will block boot on first deploy if config is templated in multiple environments.
  • cache_provider is now a Symfony cache pool id, and doctrine/cache is gone. Any custom cache wiring, or a cache.app assumption, must be re-pointed. Note the deliberate behavior: autowired repositories receive Ting's cache, not cache.app — correct, but surprising if anyone assumed otherwise.
  • Vendor lineage matters: if the estate is on ccmbenchmark/ting_bundle, this is a vendor switch, and Flex users must hand-check config/bundles.php after the swap. That is a distinct, higher-risk migration path.

Technical risk (ranked)

  1. Enum data conversion (High). Existing JSON-encoded enum values in production columns must be converted, or storage frozen via enum_serializer: symfony_serializer. Frozen storage is a valid deferral but accumulates as permanent debt and diverges from upstream defaults.
  2. Vendor switch from ccmbenchmark/ting_bundle (High, if applicable). Bundle registration, namespace, and config keys all move; no automated path documented beyond a manual check.
  3. Symfony 7.4/8 platform upgrade (Medium). Out of scope of this package but on the critical path; the 4.0 release cannot be evaluated independently of it.
  4. Maintainer/bus factor (Medium–High). Single-author package, niche adoption, no commercial support. Two major versions of breaking changes in the visible history. atoum → PHPUnit and a getting-started guide validated against a real kernel are genuine health signals, but they do not offset the concentration risk.
  5. Behavioral drift in error surfaces (Low–Medium). JSON columns now return associative arrays instead of stdClass; serializerOptions now replace rather than merge into lists; refreshUser() reload semantics changed. These are fixes, but each is a place where downstream code may have encoded the old behavior.

Key questions for the maintainer / internal owners

  • Is there a documented, scriptable conversion for 3.x JSON-encoded enum columns, and is it reversible?
  • What is the supported deprecation policy between majors — is 5.0 expected within 12 months?
  • Which Symfony minor will be the floor for the next major, and is 7.4 an LTS-style commitment or a stepping stone?
  • Does enum_serializer: symfony_serializer carry a removal date, or is it a permanent compatibility mode?
  • Who internally owns the Symfony service, and is there a second engineer capable of maintaining attribute-mapped entities?

Integration Approach

Stack fit

  • Laravel application: not applicable. Do not attempt to bridge Ting into Laravel — the container, routing, profiler, and user-provider contracts are all Symfony-specific, and the ORM's unit-of-work model conflicts with Eloquent's Active Record assumptions in the same codebase. Reject on architecture, not on quality.
  • Symfony 7.4/8 application already using Ting: adopt, sequenced around the enum data migration.
  • Symfony application on Doctrine ORM: this is not a drop-in and not a like-for-like swap; adopting Ting is a re-modelling exercise, not an upgrade. Treat as a separate initiative.

Migration path (Symfony, already on Ting 3.x)

  1. Pre-flight (read-only): inventory every entity with a #[Column] backed enum; count affected rows per column; record which connection/database each entity resolves to; grep for master/slaves keys and UniqueEntity positional arguments; identify any doctrine/cache usage.
  2. Platform first: land PHP 8.2+ and Symfony 7.4 in a separate, no-behavior-change release. Confirm zero deprecations from the bundle on 7.4 (the release explicitly claims this — verify it in your own CI, don't take it on faith).
  3. Cache rewiring: point cache_provider at a named Symfony cache pool; confirm autowired repositories are pulling Ting's cache and not cache.app.
  4. Connection rename: primary/replicas across all environment configs, including templated/secret-managed config that CI does not lint.
  5. Enum decision gate: either (a) convert stored values with a tested, reversible migration, or (b) pin enum_serializer: symfony_serializer and schedule the conversion. Recommend (b) for the first release, (a) within one quarter — do not let the compatibility flag become permanent.
  6. UniqueEntity → named arguments, then re-run the full validation suite; this is where silent behavior changes hide.
  7. Deploy to a worker-mode runtime only after confirming repository reset behavior under sustained load, not just a smoke test.

Compatibility matrix to pin in the repo

  • PHP 8.2/8.3 with Symfony 7.4; PHP 8.4 with Symfony 8.
  • xavierleune/ting must be ^4.0 — do not allow a floating constraint here; bundle and core are versioned in lockstep in practice.
  • FrankenPHP and RoadRunner are now supported targets; traditional PHP-FPM remains the low-risk default for the first release.

Sequencing Platform bump → cache rewire → config rename → UniqueEntity → enum deferral flag → worker-mode enablement → enum data conversion. The first five are same-sprint mechanical work; the last is a scheduled data project. Do not bundle the enum conversion into the upgrade release — keep the reversible step and the irreversible step in separate deploys.

Operational Impact

Maintenance

  • Upgrade cadence is the dominant operational cost. The package has shipped breaking changes across 3.x → 4.0 spanning platform, config keys, cache layer, and storage format in a single release. Budget for a major-version upgrade project every 12–18 months, not a routine patch cadence.
  • atoum → PHPUnit reduces the "exotic toolchain" tax and is a meaningful maintainability improvement — one fewer bespoke test runner for the team to learn.
  • Attribute-driven mapping with compile-time validation lowers day-2 maintenance: invalid entities fail the build rather than failing at runtime. This is the highest-value operational change in the release.

Support

  • No commercial backing, single primary author. Mitigations: fork-and-vendor the package internally if the application becomes business-critical; keep the enum and mapping logic thin enough that a fork is survivable; avoid deep reliance on undocumented internals (RepositoryFactory autowiring is convenient but is an internal seam).
  • Documentation improved materially (new README, getting-started guide validated against a real kernel in CI). That raises the floor for onboarding but does not create a support contract.

Scaling

  • Worker-mode support is the scaling unlock: FrankenPHP/RoadRunner compatibility moves this from "PHP-FPM only" to "long-running runtime viable," which matters for high-throughput, low-latency services.
  • Connection pooling with primary/replicas is now first-class configuration. Read-replica routing becomes an operational lever rather than custom code — but it also means replica-lag behavior is now your problem to monitor and reason about.
  • Query cache backed by any Symfony cache pool is a genuine improvement: cache backend choice (Redis, APCu, filesystem) is now a standard Symfony decision rather than a package-specific one, which simplifies capacity planning and removes doctrine/cache from the dependency and vulnerability surface.

Failure modes to instrument

  • Enum read mismatch — a row written by 3.x read by 4.x surfaces as a type/deserialization error at the mapping layer, potentially only on specific records. Highest-severity, lowest-detectability failure. Mitigate with a pre-migration scan and post-migration reconciliation count.
  • Boot failure from stale config — master/slaves keys, a non-pool cache_provider id, or a #[Table] missing connection/database/repository all fail container build. Loud and fast, which is the right behavior, but it means a bad config deploy is a hard outage, not degradation. Stage the config change.
  • Request-scoped state leakage under worker mode — the release fixes repository reset, but any custom service holding a Ting repository or unit of work is now a suspect. Audit for long-lived references before enabling FrankenPHP/RoadRunner.
  • Cache pool misconfiguration — autowired repositories receive Ting's cache rather than cache.app; a pool that is too small or not shared across workers silently degrades query performance rather than erroring.
  • JSON column shape change — code implicitly expecting stdClass will now receive an associative array. Grep for property access on JSON-derived values.
  • UniqueEntity message rendering with enum/date/object values changed; any test asserting on violation message text needs review.

Ramp-up

  • Getting-started guide plus real-kernel CI validation shortens time-to-first-entity substantially for a Symfony-fluent engineer: ~1–2 days to a working entity/repository against the new docs.
  • The real ramp cost is conceptual, not mechanical: the data-mapper + unit-of-work model, serializer-driven change tracking (readonly value objects, enums, DateTimeImmutable not compared on every save, #[Column(mutable: ...)] override), and the primary/replicas topology. Budget 1–2 weeks for a mid-level engineer to be productive without supervision.
  • Bus factor of one is the binding constraint. Require a second engineer to complete the 4.0 upgrade end-to-end as a deliberate cross-training artifact; that upgrade is the cheapest available onboarding into the package's internals.
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.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
adachsoft/php-code-style