macpaw/behat-orm-context
Behat ORM Context by MacPaw provides Doctrine ORM-aware Behat contexts for acceptance testing in PHP projects. It helps manage entities, fixtures, and database state, keeping scenarios isolated and readable while reducing boilerplate around test data setup and cleanup.
Architecture fit — still poor for a Laravel-first stack, but the objection is now about value, not viability. The package remains a Symfony bundle shipping Behat contexts for Doctrine ORM testing. v2.0.0 changes nothing about the bundle/kernel model, so the auto-wiring value proposition still does not map onto Laravel. Adoption remains conditional on a Laravel service that has deliberately introduced Doctrine ORM (e.g. laravel-doctrine) and accepts Behat as a second BDD layer alongside Pest.
Integration feasibility — materially improved; the hard blocker is gone. The prior assessment identified the symfony/framework-bundle ^6.4 pin as "the real gate," because Laravel 10/11 ship Symfony 7 components. v2.0.0 widens to Symfony 6.4–8, which now spans the Symfony floors of Laravel 10, 11, and 12. Doctrine ORM 2–3 and Behat 3 are also widened. The package stays dev-only with no runtime services. Net: Composer resolution moves from "likely conflict requiring a fork" to "verify, then proceed." This is the single most consequential change in the release and it directly retires the top-listed failure mode.
Technical risk — high, but now concentrated in project maturity rather than compatibility. Code quality signals remain strong (PHPStan max + phpstan-doctrine, PSR-12/Slevomat, Rector, composer dev-checks). Ecosystem signals are unchanged and unaddressed by this release: small repo, single-vendor origin (MacPaw), no security policy or disclosure path documented in the notes, no evidence of multi-maintainer structure. The 2026-03-30 date anomaly from the prior assessment is not resolved by the changelog link alone; treat provenance as unverified until the tag and commit signing are checked. The internal-score (9.2) vs opportunity-score (44.1) divergence persists and continues to look like code hygiene being scored as adoption value.
Release-specific observations.
<6.4 and PHP <8.1 dropped, no public API change. Upgrade cost from v1.2.0 is effectively zero for anyone already on a supported stack; for us it is a non-event because we are not on v1.x.require-dev only and do not reach consumers. They matter only if we vendor the source and run upstream tests in our CI.Key questions:
composer.lock, and does any other dependency pin Symfony <6.4?describe features do not, given existing team fluency?TPM recommendation: Unchanged in direction, upgraded in confidence — do not adopt for a Laravel-only Eloquent codebase; green-light a scoped spike inside a Doctrine-based subservice. The difference from the prior assessment is that the spike is now cheap to attempt and unlikely to die on Composer.
Stack fit. Default: no fit. Conditional fit: Laravel app + Doctrine ORM + a genuine Gherkin/QA-owned acceptance-test requirement. The widened constraints make the conditional case reachable on Laravel 10/11/12; they do not create a reason to adopt.
Migration path. Do not replace Pest/PHPUnit. Add as a dev-only dependency in an isolated suite (tests/behat/ or a dedicated behat.yml profile), instantiate contexts manually rather than relying on Symfony bundle registration, and inject the EntityManager explicitly. If bundle service definitions prove necessary, run a minimal Symfony kernel sidecar rather than emulating bundles inside Laravel.
Compatibility. The checks are now verification, not gate-finding:
composer why-not symfony/framework-bundle ">=6.4 <9" against composer.lock — confirm no transitive pin below 6.4 survives.symfony/* floor falls inside 6.4–8 (all current LTS-supported versions do).^8.1; upstream's config.platform.php = 8.1.0 remains compatible and conservative.Sequencing.
The widened constraints remove the prior "fork or pin shared Symfony packages" branch from the sequencing, which is the concrete scheduling win here.
Maintenance. MIT, no runtime footprint, mature tooling config. If vendored, note that the upstream dev toolchain now requires PHPUnit 10.5/11, PHPCS 4, Rector 2, and PHPStan 2 — align our fork's CI to those versions rather than back-porting. Ownership cost is unchanged: no upstream community to absorb breakage, so we own any fork.
Support. Still no evidence of a security policy, release cadence, or multi-maintainer structure; this release does not add one. Keep the "experimental / vendor-risk" tier. If adopted, pin the exact tag, vendor the source, and document the fork procedure. Reject transitive adoption from another team without review.
Scaling. Test-only. CI remains the only scaling vector: a second runner, second config surface, and Behat's slower execution versus Pest. Budget CI minutes and expect a second class of flaky-test failure modes.
Failure modes.
^6.4 vs Laravel's Symfony 7<6.4.composer update at the wrong time breaks the suite with no upstream fix.Ramp-up. Unchanged: Pest fluency does not transfer to Gherkin step definitions, Behat hooks, or Doctrine's identity map and unit-of-work. Expect 1–2 weeks for one engineer to become internal owner, plus ongoing Eloquent↔Doctrine translation overhead. Justified only where a Doctrine service already exists and QA has an explicit Gherkin requirement.
How can I help you explore Laravel packages today?