mrmitch/mssql-bundle-legacy
Legacy MSSQL bundle for Laravel/PHP, providing SQL Server driver integration and configuration for older framework versions. Helps maintain legacy apps that still rely on Microsoft SQL Server connections.
Evidence base / confidence. This assessment is derived from a single release-note line (require \doctrine/common:*``) with no prior assessment and no repository metadata. Confidence is low; the recommendations below are contingent on verifying the actual composer.json diff. The release is nonetheless material because it introduces a new hard runtime dependency in a minor version bump, which is the single most consequential class of change a composer package can ship.
Architecture fit. doctrine/common is the legacy shared foundation of the Doctrine DBAL/ORM stack, not an idiomatic Laravel/Eloquent dependency. If the package only needs a small utility (e.g. ClassUtils, comparators, or a handful of collection helpers), pulling the full doctrine/common graph is architecturally disproportionate — those helpers now live in the narrower doctrine/persistence and doctrine/collections packages. If the package genuinely bridges to Doctrine ORM/DBAL, the dependency is legible but should be declared against the specific artifact used, not the meta-package. Fit verdict: acceptable only if the usage is real and narrow-scoped.
Integration feasibility. Composer-level resolution is straightforward — the package is public and doctrine/common is widely mirrored. The blocker is the constraint itself: * is an unbounded, unversioned contract. It defeats semver, permits any past or future major (including a hypothetical 4.x with removed APIs), and makes composer update behaviour non-deterministic across teams and dates. For a Laravel package, this also means the dependency can silently conflict with doctrine/dbal versions used by migration tooling (->change(), column introspection) in the host application. A properly scoped constraint (^2.13 || ^3.0) would reduce this to a routine review.
Technical risk. Rated medium-high, with three distinct exposures:
doctrine/* versions may hit resolution failures on composer update, and composer require of the new version may fail outright in Doctrine-heavy apps. This is a de facto breaking change regardless of the version number.*, every published doctrine/common version (and its transitive tree: doctrine/persistence, doctrine/collections, and in 2.x the event manager) becomes an allowed attack and CVE surface with no maintainer gate.doctrine/common has been progressively reduced and de-emphasised by Doctrine in favour of the split packages. Dependending on a shrinking meta-package with an unpinned range is a poor long-term bet.Key questions for the maintainer.
doctrine/common does the package call? Is there a narrower package that provides them?require or require-dev? The note says require — confirm, and confirm whether the dependency is optional at runtime (suggest) and could be guarded behind a feature flag or bridge/sub-package.* rather than a bounded range? Is there a PHP-version compatibility reason that prevented a proper constraint?--prefer-lowest and --prefer-stable?Stack fit. Laravel 9–11 / PHP 8.1+ / Composer 2. doctrine/common is absent from the default Laravel skeleton, so this adds net-new install footprint for teams that deliberately avoid Doctrine. Confirm the package does not assume a Doctrine EntityManager is present — a hard dependency that is only conditionally consumed is the worst of both worlds (install cost, no capability guarantee).
Migration path (2.1.x → 2.2.0). Treat as a dependency-change release, not a feature release:
composer.json and composer.lock between tags before adopting.composer update <package> --with-dependencies on a copy of the real application lock file and inspect the full transitive diff, not just the direct requirement.--prefer-lowest and --prefer-stable to probe both ends of the wildcard.doctrine/common requirement in the root composer.json — a root-level pin overrides the package's * and restores determinism. Alternatively use conflict entries to fence off known-bad majors.Compatibility. The wildcard resolves to the highest available version by default, so effective behaviour drifts with Packagist state rather than with the package's version. Note that doctrine/common 2.x and 3.x differ substantially in scope and PHP floor; a * constraint means two consumers on the same package version can run materially different code. Verify no duplicate-instance problems (Doctrine annotations/registry singletons) in apps already carrying doctrine/dbal.
Sequencing. (1) Confirm actual usage and constraint rationale with the maintainer. (2) Root-level pin in the consuming application. (3) Dependency-resolution CI job on a schedule (weekly) to catch drift. (4) Stage in one canary service. (5) Fleet rollout, keeping 2.1.x pinned as the rollback target until the constraint is narrowed. If the maintainer ships a bounded constraint in a follow-up, re-evaluate downward.
Maintenance. Ownership of the added dependency sits with the Doctrine team, not the package author, and doctrine/common's direction is consolidation/removal — a maintenance liability the consuming team inherits without a say. An unpinned range also means the package author has effectively delegated upgrade control to consumers, which in practice means nobody owns it. Budget a recurring line item for constraint auditing.
Support. Failure signals split sharply by mode: resolution failures are loud and cheap to diagnose; runtime type/interface errors from an unexpected major are quiet and expensive. Neither routes naturally to Laravel community channels — expect to escalate to Doctrine upstream, where the package's usage pattern is not a supported concern.
Scaling. Negligible for request-path performance if only static utilities are used. Material only if the dependency pulls Doctrine's event manager, annotation reader, or proxy generation into bootstrap: measurable autoload/opcache classmap growth and per-request memory on high-throughput PHP-FPM. Worth a one-off benchmark before fleet-wide adoption; irrelevant for queue/CLI-heavy workloads.
Failure modes. (a) An unrelated composer update breaks a deployment pipeline via a newly introduced transitive conflict. (b) Silent drift to a breaking major between builds. (c) Security advisory against any version in the permitted range forces emergency root-level overrides across every consuming repo. (d) Divergent lock files between developer machines and CI producing non-reproducible builds. (e) Duplicate Doctrine versions in the graph causing class-identity surprises. Mitigations (a), (b), (d) collapse to one action: pin at the root.
Ramp-up. Low absolute cost, but non-zero and unbudgeted: engineers must reason about a Doctrine-adjacent surface they did not choose to adopt, and the package's own documentation likely does not cover the dependency's semantics. Roughly a half-day for a senior engineer to audit, document, and pin — worth doing once centrally rather than per team.
How can I help you explore Laravel packages today?