Phinx - Outil de migration PHP - Principales commandes
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éthodedown()
.
A noter également que l'on peut, dans une méthodechange()
, conditionner une partie du code avecif ($this->isMigratingUp()){...}