Implémenter Phinx dans une application PHP
Les migrations permettent de versionner les changements apportés à la base de données. Ainsi, lorsqu’on récupère une branche développée par quelqu’un, on peut facilement jouer tous les changements apporté à la base de données. Ceci permet d’être certains que nous avons exactement la même base de donnée qu’un autre développeur. Cela permet aussi de garder un historique des actions effectuées sur la base de données.
Présentation de Phinx
De nombreux outils existe mais Phinx se démarque car il n’impose pas d’ORM et s’installe très facilement. Ceci le rend particulièrement adapté pour les vieux projets qui possèdent déjà un ORM.
De plus, Phinx est une librairie développée et utilisée par le framework CakePHP, ce qui le rend très stable. Il offre aussi des outils pour créer les migrations mais elle accepte aussi les requêtes SQL brutes.
Dans cet article nous allons faire deux migrations:
- Une pour créer une table
- Une pour insérer des données
Configuration
Phinx utilise un unique fichier de configuration. Lors de l’utilisation en ligne de commande, il va chercher un fichier nommé phinx avec une extension PHP, YAML ou JSON. La configuration spécifie juste la base à utiliser, ou son stockées les migrations, etc..
D’autres options sont présenté via la documentation.
Création de la migration
On commence par se placer dans le dossier @script@
cd script
Pour créer une migration, il suffit d’appeler Phinx et de donner un nom explicite à celle-ci:
vendor/bin/phinx create CreateExampleTable
Cette commande va simplement créer un fichier de migration. Dans ce fichier on retrouve une classe qui étend de Phinx\Migration\AbstractMigration
:
<?php
// sandbox/migrations/20180725124615_create_example_table.php
use Phinx\Migration\AbstractMigration;
class CreateExampleTable extends AbstractMigration
{
public function change() { }
}
Le code a été simplifié pour être plus concis
Cette classe possède trois méthodes qui peuvent êtres implémenté:
up
, contient les modifications à apporter sur la base de donnéesdown
, permet de revenir en arrière et d’annuler les modifications apportées parup
change
, permet de déduire les méthodesup
etdown
mais est limité à certaines action et oblige à utiliser des méthodes implémentées par Phinx
Dans notre cas, nous allons crer une nouvelle table avec la méthode change
en utilisant les méthodes pour créer une table de Phinx
// sandbox/migrations/20180725124615_create_example_table.php
// ..
public function change()
{
$this->table('example')
->addColumn('name', 'string', ['limit' => 20])
->addColumn('description', 'text')
->addIndex('name', ['unique' => true])
->save();
}
Lancer la migration
Pour jouer la migration, il suffit de lancer la commande phinx migrate
. Nous pouvons alors voir les requêtes SQL générées avec le flag -vv
vendor/bin/phinx migrate -vv
== 20180725124615 CreateExampleTable: migrating
START TRANSACTION
CREATE TABLE `example` (`id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, `description` TEXT NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY (`name`)) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
COMMIT
INSERT INTO `phinxlog` (`version`, `migration_name`, `start_time`, `end_time`, `breakpoint`) VALUES ('20180725124615', 'CreateExampleTable', '2018-07-25 15:14:41', '2018-07-25 15:14:41', 0);
== 20180725124615 CreateExampleTable: migrated 0.0051s
On voit donc que notre table a été créee et qu’un entrée a été ajouté à la table phinxlog
.
Revenir en arrière (Rollback)
A tout moment, nous pouvons décider d’ annuler la dernière migration avec la commande rollback
. Celli-ci va
- déduire l’action à effectuer en fonction de la méthode
change
si elle est implémentée - lancer la méthode
down
si elle est implémentée
vendor/bin/phinx rollback -vv
== 20180725124615 CreateExampleTable: reverting
START TRANSACTION
-- Altering table example
ALTER TABLE `example` DROP INDEX `name`
-> 0.1377s
-- Altering table example
ALTER TABLE `example` DROP COLUMN `description`, DROP COLUMN `name`
-> 0.3764s
COMMIT
DELETE FROM `phinxlog` WHERE `version` = '20180725124615'
== 20180725124615 CreateExampleTable: reverted 0.5522s
Insérer des données
On crée une nouvelle migration
vendor/bin/phinx create InsertSomeExamples
Cette fois ci, nous utilisons les méthodes up
et down
<?php
// sandbox/migrations/20180725132458_insert_some_examples.php
use Phinx\Migration\AbstractMigration;
class InsertSomeExamples extends AbstractMigration
{
public function up()
{
$this->table('example')
->insert(['name' => 'My first example', 'description' => 'azertyuiop'])
->saveData();
}
public function down()
{
$this->execute('DELETE FROM example');
}
}