Skip to content
Snippets Groups Projects
Thomas Flori's avatar
Thomas Flori authored
Camel case is not supported by some database. Postgres for example
returns every column name in lower case. That does not lead to errors
but even more dangerous it jus silently fails when you try to access
`Migration::$executionTime`.
b340058e

breyta

Build Status Coverage Status Latest Stable Version Total Downloads License

Breyta is a library for database migrations. There are a lot of applications for database migrations but no actual library (without any user interface).

Trivia

I created this library after trying ruckusing-migrations. It's the only one that does not require any additional library to provide a user interface and is mentioned in awesome-php. Unfortunately it seems to be not actively developed and maintained. Also I'm missing some functionality and it is very old, not using PSR-2/4 and namespaces.

The name for this library comes again from the Icelandic language and means "to change".

Concept

  • A migration is a set of database statements
  • A migration has to run in a transaction
  • Logging is important and goes to the migration table
  • No code generating from this library (pure SQL)
  • No user interface (API only)
  • Generate fancy output and support progress bars

Installation

We only support and suggest using composer - everything else on your own risk.

$ composer require tflori/breyta

Usage

This might change in the next days till version 1.

Migration Script:

<?php

namespace Breyta\Migrations;

use Breyta\AbstractMigration;

class CreateAnimalsTable extends AbstractMigration
{
    public function up(): void
    {
        $this->exec('DROP TABLE IF EXISTS animals');
        $this->exec('CREATE TABLE animals (
             id MEDIUMINT NOT NULL AUTO_INCREMENT,
             name CHAR(30) NOT NULL,
             PRIMARY KEY (id)
        )');
    }

    public function down(): void
    {
        $this->exec('DROP TABLE IF EXISTS animals');
    }
}

Control structure:

<?php

namespace App\Cli\Commands;

class MigrateCommand extends AbstractCommand // implements \Breyta\ProgressInterface
{
    /**
     * Your database connection
     * @var PDO
     */
    protected $db;

    public function handle()
    {
        $breyta = new \Breyta\Migrations($this->db, '/path/to/migrations', function($class, ...$args) {
            // return app()->make($class, $args);
            // the closure is optional. default:
            if ($class === \Breyta\AdapterInterface::class) {
                return new \Breyta\BasicAdapter(...$args); // first arg = closure $executor
            }
            return new $class(...$args); // first arg = AdapterInterface $adapter
        });
        
        // register handler (optional)
        /** @var \Breyta\CallbackProgress $callbackProgress */
        $callbackProgress = $breyta->getProgress();
        $callbackProgress->onStart([$this, 'start'])
            ->onBeforeMigration([$this, 'beginMigration'])
            ->onBeforeExecution([$this, 'beforeExecution'])
            ->onAfterExecution([$this, 'afterExecution'])
            ->onAfterMigration([$this, 'finishMigration'])
            ->onFinish([$this, 'finish']);
        
        // alternative: implement \Breyta\ProgressInterface and register
        // $breyta->setProgress($this);
        
        $breyta->migrate();
    }
}

Please also have a look at the reference for a better overview of the api.