Phinx - Outil de migration PHP - Principales commandes

Florian Journeau
Florian JOURNEAU 22 January 2021
Catégorie : PHP

Installation



composer require robmorgan/phinx


Pour démarrer


vendor/bin/phinx init .

Initialisation de phinx dans le répertoire courant.
Cela va créer un fichier phinx.php (ou phinx.yaml) .

Pour ma part, je récupère les informations de connexion dans le fichier .env :


<?php

/* --- Chargement des vars d'environment */
require 'vendor/autoload.php';
try {
    (\Dotenv\Dotenv::createImmutable(__DIR__))->load();
} catch (\Dotenv\Exception\InvalidPathException $e) {
    die("Fichier d'environnment .env manquant !");
}

return
[
    'paths' => [
        'migrations' => '%%PHINX_CONFIG_DIR%%/migrations/migrations',
        'seeds' => '%%PHINX_CONFIG_DIR%%/migrations/seeds'
    ],
    'environments' => [
        'default_migration_table' => 'fjo_phinxlog',
        'default_environment' => 'current_db',
        'current_db' => [
            'adapter' => 'mysql',
            'host' => $_ENV['DB_HOST'],
            'name' => $_ENV['DB_NAME'],
            'user' => $_ENV['DB_USER'],
            'pass' => $_ENV['DB_PASSWORD'],
            'port' => '3306',
            'charset' => 'utf8',
        ],
        'testing' => [
            'adapter' => 'sqllite',
            'host' => 'localhost',
            'name' => 'testing_db',
            'user' => 'root',
            'pass' => '',
            'port' => '3306',
            'charset' => 'utf8',
        ]
    ],
    'version_order' => 'creation'
];


Création d'une migration



vendor/bin/phinx create MyTempTestMigration

Un fichier migration sera créé dans le répertoire spécifié dans le phinx.php (ou phinx.yaml) dans le répertoire racine,
Fichier créé YYYYMMDDHHMMSS_my_temp_test_migration.php :

<?php

// declare(strict_types=1);

use \Phinx\Migration\AbstractMigration;

final class MyTempTestMigration extends AbstractMigration
{

    public function change(): void
    {

        /* On vérifie si la table n'existe pas déjà */
        if (!$this->hasTable('user_test_phinx')) {

            /* Création d'une table de test */
            $this->table('user_test_phinx')
                ->addColumn('email', 'string', ['limit' => 100])
                ->addColumn('name', 'string', ['limit' => 40])
                ->addColumn('description', 'string', ['limit' => \Phinx\Db\Adapter\MysqlAdapter::TEXT_LONG])
                ->addColumn('created_at', 'datetime')
                ->addColumn('updated_at', 'datetime', ['null' => true])
                ->addIndex('email', ['unique' => true])
                ->create();
        }

        /* On vérifie qu'on est bien en mogration (et pas en rollback) */
        if ($this->isMigratingUp()) {

            // Une ligne
            $this->table('user_test_phinx')->insert(['email' => "mail@test.fr", 'name' => 'Testeur'])->saveData();

            // Multi lignes
            $this->table('user_test_phinx')->insert([
                ['email' => "mail1@test.fr", 'name' => 'Testeur 1'],
                ['email' => "mail2@test.fr", 'name' => 'Testeur 2']
            ])->save();
        }

    }
}


Lancement d'une migration


vendor/bin/phinx migrate

Exécute les migrations non encore exécutée.


Annulation d'une migration


vendor/bin/phinx rollback

Annule la dernière migrations :

  • Si le code a été fait dans la méthode change() et que les changements fait sont compatibles avec le rollback, alors, cela va défaire ce qui a été fait

  • Plus robuste (selon moi en tout cas, on a un meilleur contrôle de ce qui est fait), les migrations sont codées dans la méthode up(), et le code de rollback dans la méthode down().
    A noter également que l'on peut, dans une méthode change(), conditionner une partie du code avec if ($this->isMigratingUp()){...}