2015-07-16 8 views
0

Pour certains de mes tests, j'ai besoin de la méthode setUpBeforeClass pour exécuter des migrations sur tous les modules présents, et de tearDownAfterClass pour ré-migrer les modules. Via la ligne de commande c'est facile à faire:Comment exécuter des migrations de module par programme dans FuelPHP?

oil r migrate --modules 

... pour exécuter les migrations du module, puis:

oil r migrate --modules --version=0 

... pour les réinitialiser. Cependant, dans les tests, je dois le faire par programmation, et je n'arrive pas à comprendre comment exécuter les commandes ci-dessus en utilisant la classe Migrate de FuelPHP. Les deux méthodes latest et version semblent vous demander de spécifier un nom de module, mais je souhaite simplement migrer tous les modules présents. Est-ce possible?

Répondre

1

Vous avez besoin d'un bidouillage pour que cela fonctionne.

Voici comment le pétrole le fait:

https://github.com/fuel/core/blob/1.8/develop/tasks/migrate.php#L101

Vous pouvez également utiliser Module::loaded() pour obtenir les modules chargés.

Vous pouvez ensuite exécuter des migrations pour chaque module.

+0

Huh, c'est bizarre. Savez-vous s'il existe un moyen de le faire via l'huile - par exemple. 'Oil \ Refine :: run ('import', array ('- modules')'? (J'ai essayé ça et ça ne semble pas fonctionner, mais j'ai l'impression qu'il pourrait y avoir une solution dans ce sens ...) –

+0

Eh bien, je ne voudrais pas jouer avec l'huile, mais je suis sûr que l'importation n'est pas le nom de la tâche de migration, c'est migrer.Je préfère ignorer l'huile et utiliser les méthodes que j'ai mentionnées plus haut: obtenir des noms de modules Sinon, vous pouvez également appeler l'huile en utilisant 'exec' –

+0

Argh, désolé, c'était une erreur de couper-coller, je voulais dire 'Oil \ Refine :: run (' migrate ', array (' - module ') "import" est une tâche que j'ai écrite, et je lance Oil comme ça dans un de mes tests pour tester la tâche d'import, donc je sais que ça peut marcher. –

1

Les migrations sont gérées par la classe Migrate, de sorte que vous pouvez l'utiliser dans votre code si vous voulez exécuter les migrations:

$results = Migrate::up(null, 'mymodulename', 'module'); 

De même à la tâche, vous pouvez également utiliser vers le bas() et le courant().

Notez que cela ne chargera pas le module, donc si l'une de vos migrations de module requiert une classe du module, assurez-vous de charger le module en premier!

+0

Merci.Le problème est, vous devez nommer le module ici, et je voudrais écrire ceci d'une manière générique (parce que je veux courir la même suite de test bien qu'il puisse y avoir différents modules présents). Les commandes d'huile ci-dessus semblent parfaitement le faire. Existe-t-il un moyen d'utiliser Migrate pour obtenir le même résultat? (c'est-à-dire exécutez/révisez * toutes les migrations de module présentes) –

+0

S'il vous plaît, lisez ma réponse. Il y a le chemin. Encore une fois: obtenez une liste de TOUS les modules (généraux) et exécutez la migration pour eux. –

+0

@ mark.sagikazar: 'Module :: loaded()' ne fonctionne pas dans mon cas - il retourne un tableau vide - car le module ne contient rien d'autre que quelques migrations spécifiques aux instances qui ne peuvent pas aller dans l'application elle-même. Donc, le module n'est pas chargé dans le code. –