cycle/migrations
Cycle Database Migrations provides structured, versioned database schema changes for PHP applications. Configure a migrations directory and vendor paths, initialize the migration table, then run migrations programmatically or generate migration files during schema compilation.
Framing correction first: this package is the migration component of the Cycle ORM / Cycle Database stack (Spiral ecosystem, maintained by Spiral Scout), not a Laravel or Eloquent tool. It is framework-agnostic PHP that runs against Cycle\Database\DatabaseManager. Any roadmap discussion has to start from "are we on Cycle?" — it is a consequence of the persistence decision, not an input to it. It is also not a scaffolding generator on its own; automatic generation lives in the separate cycle/schema-migrations-generator extension.
Decisions it actually informs:
run() semantics. The buy case is decent if you are already in the ecosystem; the build case wins if you are not.vendorDirectories lets internal Composer packages ship their own migrations. This supports a decision to let teams own their schema slice inside one deployable, instead of a central DBA queue.Migrator is a library object with a run() loop and a safe flag — you embed it in your deploy script or a console command. That pushes a decision about where migrations execute (CI job vs. container entrypoint vs. gated manual step) and whether confirmation prompts are appropriate for your risk posture.What it does not support: it is not a data-migration/backfill tool, not an online-DDL orchestrator, not a drift detector, and it gives you no CLI ergonomics or GUI. Do not put it on a slide as a productivity multiplier for application developers — the productivity story belongs to the generator extension, and even there the gain is modest.
Adopt if:
vendorDirectories).Migrator rather than a batteries-included CLI.CURRENT_TIMESTAMP support, after/first attribute handling.Look elsewhere if:
while loop; generation documentation lives in a separate repository. Budget for reading source.Mitigation if you adopt: keep migrations as plain PHP files in a standard directory, wrap Migrator behind one internal service/command, and invoke it from exactly one place in your deploy pipeline. Lock-in then lives in the schema DSL — which is real — rather than in the runner, which is replaceable in an afternoon.
For executives: "This is infrastructure, not a product feature. It's the migration runner for the Cycle data stack — the piece that versions and applies database schema changes in order, with a record of what has run. Two things matter for you: it's MIT-licensed and free, and it has a single commercial maintainer with a small user base. That's an acceptable risk only if we're already committed to Cycle as our data layer, in which case this comes essentially free and saves us from maintaining bespoke schema-deployment scripts. If we're not on Cycle, it isn't a candidate — and picking it would quietly commit us to a smaller ecosystem. Recommendation: treat it as a checkbox item within a Cycle evaluation, not a standalone proposal."
For engineering: "cycle/migrations gives you a Migrator (config + DatabaseManager + FileRepository) with configure() to create the migration table and a run() loop that returns migrations one at a time. You get ordered discovery from a directory, optional vendorDirectories for package-shipped migrations, a safe flag to skip confirmation prompts in automated deploys, and driver-agnostic execution so SQLite-in-memory works in CI. Migration generation is a separate package (cycle/schema-migrations-generator) — you generate, then hand-edit and commit. Caveats worth knowing up front: no CLI, no data-seeding, no drift detection, no online-DDL orchestration; the README is thin, so plan on reading source. It's not a Laravel package — it will not slot into an Eloquent codebase, and any framing that says otherwise is wrong. Realistic pitch: adopt it if we're on Cycle, isolate it behind one deploy-step interface, and keep migrations portable so swapping the runner later is cheap."
How can I help you explore Laravel packages today?