CakePHP – Plugin Migrations, indispensable

Si vous êtes développeur CakePHP et que vous n’utilisez pas le plugin Migrations alors je vous invite à lire cet article. Le plugin Migrations est tout simplement indispensable !

Kezako ?
Le plugin Migrations à pour objectif de vous permettre de « versionner » votre structure de base de données.
Prenons un exemple très simple. Vous avez un site en production avec une base de données. Dans cette base de données vous avez des tables. Tout marche correctement dans le meilleur des mondes.
Imaginons maintenant que la structure d’une table change (ajout ou suppression d’un champs). Lors de la mise en prod il faudra effectuer cette modification dans la base de données à la main … Pas cool !
Prenons un autre exemple plus complexe. Vous souhaitez ajouter un champs à une table et remplir ce champs en fonction d’un autre champs pour toutes les entrées de la table ! Encore moins cool !

Le plugin Migrations permet de régler ces problèmes et nous allons voir comment.

Installation du plugin
Le plugin est disponible sur github à l’adresse suivante : https://github.com/CakeDC/migrations.
La première étape peut être faites de trois façons différentes.

  • Vous copier les sources dans un dossier « Migrations » dans le dossier plugin de votre application
  • Si vous utilisez git vous pouvez l’ajouter en sous-module avec la commande suivante :
    git submodule add git://github.com/CakeDC/migrations.git Plugin/Migrations

    . Ensuite à chaque clone de votre dépot ils faudra taper la commande suivante

    git submodule update --init --recursive
  • En utilisant composer donc une doc est dispo ici : http://getcomposer.org/

La deuxième étape est de charger le plugin dans votre projet CakePHP. Pour cela il faut ajouter la ligne suivante dans votre fichier « Config/bootstrap.php » :*

CakePlugin::load('Migrations', array('bootstrap' => true, 'routes' => true));

Vous êtes maintenant fin près à utiliser le plugin Migrations de CakePHP pour vous simplifier la vie.

Générer une « Migrations » simple
L’utilisation du plugin Migrations se fait exclusivement en ligne de commande. Pour ceux que ça intéresse le plugin Migrations a été intégré dans l’espace administration de Croogo disponible sur github ici.

Vous allez donc devoir utiliser la console de CakePHP pour générer vos migrations. Pour ce tutorial nous allons considérer que vous avez ajouté le chemin du dossier « lib/Cake/Console » dans votre variable d’environnement $PATH. Cela permettra d’appeler le scipt « cake » de partout dans votre console.

Pour générer vos migrations le plugin va utiliser les modèles de votre application. Je vous conseil donc de créer un modèle pour chaque table de votre application. C’est une bonne pratique à avoir.
Ensuite il suffit d’exécuter la commande suivante :

cake Migrations.Migration generate

Si vous souhaitez générer les migrations d’un plugin il faut ajouter l’option -p pluginName

cake Migrations.Migration generate -p pluginName

Les questions suivantes vont vous être posées :

  • Do you want generate a dump from current database? Il faut répondre oui
  • Do you want to preview the file before generation? Répondre oui pour prévisualiser la migration dans la console
  • Please enter the descriptive name of the migration to generate: Donnez un nom à votre migration. Vous pouvez mettre des espaces. Évitez les caractère spéciaux, cette description est utilisée comme nom de class (après avoir été « sluggisée »

Un fichier php est donc généré dans le dossier « Config/Migration » du dossier « app » ou du dossier de votre plugin.
Celui-ci devrait ressembler à quelque chose comme cela :

<?php
/**
 * On constate que le nom de la classe correspond à la desciption
 * que l'on a fournit
 */
class AddArticlesTable extends CakeMigration {
 
	/**
	 * Contient la structure de la base de données.
	 * La clef "up" corresponds au modification à faire lors d'une migration
	 * La clef "down" corresponds au modification à faire lors d'un retours en arrière
	 */
	public $migration = array(
		'up' => array(
			'create_table' => array(
				'articles' => array(
					'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
					'title' => array('type' => 'string', 'null' => false, 'default' => NULL, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
					'content' => array('type' => 'string', 'null' => false, 'default' => NULL, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
					'indexes' => array(
						'PRIMARY' => array('column' => 'id', 'unique' => 1),
					),
					'tableParameters' => array('charset' => 'latin1', 'collate' => 'latin1_swedish_ci', 'engine' => 'InnoDB'),
				),
			),
		),
		'down' => array(
			'drop_table' => array(
				'articles'
			),
		),
	);
 
	/**
	 * Les méthodes before et after on en parlera juste après.
	 */
	public function before($direction) {
		return true;
	}
	public function after($direction) {
		return true;
	}
}

Vous remarquerez que le nom du fichier de la migration commence par un timestamp.

Appliquer une « Migration »
Rien de plus simple. Il faut lancer la commande suivante :

cake Migrations.Migration run all

Ou, si vous souhaitez appliquer une migration d’un plugin

cake Migrations.Migration run all -p pluginName

Cette commande va exécuter toutes les migrations qui n’ont pas encore été effectuées. Le plugin « Migrations » utilise une table nommé « schema_migrations » pour connaître les migrations qui ont été exécutées.
Vous pouvez ensuite vous amuser en remplace le paramètre « all » par « reset », « down » et « up ».

Conclusion
Pour cet exemple nous avons vu une application classique du plugin Migrations. Il nous a permit de mettre à jour une structure de table assez classique.
Le plugin Migrations permet aussi de gérer des migrations beaucoup plus complexes. Par exemple il permet d’appliquer des modifications sur les valeurs contenues sur la table que vous souhaitez modifier en passant par les méthodes before ou after.

Aymeric DERBOIS

J'ai 27 ans et je suis développeur. Je travail la plupart du temps sur des techno web, mais pas que. Étant à l'affût des nouveautés, j'adore découvrir tout et n'importe quoi dans l'informatique. Je suis amoureux de CakePHP et j'utilise au quotidien Django. Je suis très ouvert d'esprit :). J'aime bien utiliser AngularJS aussi de temps à autre pour faire du front. Au quotidien j'utilise Fedora/Ubuntu pour le desktop et CentOS pour mes serveurs. Par ailleurs je maîtrise le C/C++/Python/PHP/...

More Posts - Website

Follow Me:
Twitter

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.