Using Phinx Programmatically

Phinx is a really cool database migration package that allows you to write changes to your database as code. It keeps track of which changes have been applied and allows you the option of rolling back if you hit an issue.

All the documentation on Phinx describes a typical setup where you would run the phinx command to do your migrations. And that is all fine and good in most projects. But what happens if you are integrating Phinx into an existing project that already has a lot of the usual scaffolding in place?

Why would you want to do this? Maybe this file will be copiled into a Phar so there is no other commands to call. Maybe it uses an internal SQLite database that is persistent. In my case, I am building an application contained in a Docker container that already has symfony\console and a bunch of console commands. It seems weird to just shell out and run some commands.

But, Phinx is written in PHP. And that means that there is a good chance that there is a way to do it programmatically from within the code we have already written (such as from our existing bootstrap command).

It turns out that there is, and it is VERY straightforward. It looks something like this:

use Phinx\Config\Config;
use Phinx\Migration\Manager;

$base = "/full/path/to/your/root";

$phinx = new Manager(
    new Config([
        'paths' => [
            'migrations' => "$base/Database/Migrations",
            'seeds'      => "$base/Database/Seeds",
        ],
        'environments' => [
            'default_migration_table' => 'phinxlog',
            'default_database'        => 'production',
            'production'              => [
                'adapter'   => $config->get('database.driver'),
                'host'      => $config->get('database.host'),
                'user'      => $config->get('database.username'),
                'pass'      => $config->get('database.password'),
                'port'      => $config->get('database.port'),
                'name'      => $config->get('database.database'),
                'suffix'    => $config->get('database.suffix'),
            ]
        ]
    ]),
    $input,
    $output
);

// Run any migrations.
$phinx->migrate('production');

Want to rollback?

$phinx->rollback('production');

Some notes about this:

  • $input and $output are symfony/console’s InputInterface and OutputInterface. I was already running this from an existing console command so it made sense to just reuse them,

  • $config->get() is an config fetcher, but I am sure you can see what is going on here.

Basically, the config you write should match the Phinx Yaml file.

Did something I wrote help you out?

That's great! I don't earn any money from this site - I run no ads, sell no products and participate in no affiliate programs. I do this solely because it's fun; I enjoy writing and sharing what I learn.

COVID-19 has taken the world by storm and left a lot of brokenness in its wake. A lot of people are suffering. If you feel so inclined, please make a donation to your local food bank or medical charity. Order take-out from your local Chinese restaurant. Help buy groceries for an unemployed friend. Help people make it through to the other side.

But if you found this article helpful and you really feel like donating to me specifically, you can do so below.

Read More

Monitoring for Filesystem Changes using PHP and Laravel

Let’s say you have a Laravel application that does some data processing, and you want to monitor a directory for incoming changes, that you can then process using queued jobs. There are a couple of ways you could do something like this. You could scan those directories on a schedule using a cronjob. It’s doable. But what happens if you want to monitor a few thousand directories for changes? You can use tools like incron. Also doable, but another dependency. But what if I told you you could do it all with PHP. And within Laravel, no less?

New Open Source Code

Launched two new pieces of open source code in the last couple of months. PlayerControls PlayerControls is a macOS Cocoa framework that creates a View containing playback controls for media like videos or sounds. It is written in pure Swift 4 and has no dependencies. SearchParser SearchParser is a parser that converts a freeform query into an intermediate object, that can then be converted to query many backends (SQL, ElasticSearch, etc). It includes translators for SQL (using PDO) and Laravel Eloquent ORM. It supports a faceted language search as commonly found on many sites across the web. It is written in modern PHP. Both are licensed under the MIT license. Go check them out on Github.