Créer une tache sous symfony 1.0

Tagged:

Et aussi comment utiliser les paramètres de connexion de l'application avec cette tâche. En fait le but
pour moi est d'utiliser le commandline, c'est super bien fait sur les dernières versions de symfony, mais
sous la 1.0 c'est une catastrophe.

Le meilleur moyen que j'ai trouvé pour utiliser cette commandline c'est de créer un plugin.

Sous le répertoire plugins faite une hiérarchie comme suit :
plugins/myTaskNamePlugin/data/tasks/sfPakeMyTaskName.php

Et la vous avez compris l'histoire avec le nom hein ... myTaskName avec ou sans majuscule toussa !

Le fichier contient :

  1. <?php
  2.  
  3. pake_desc('Description');
  4. pake_task('my-taskname'); /* this name will be used by the commandline ./symfony my-taskname */
  5.  
  6. function run_my_taskname($task, $args)
  7. {
  8.  
  9. echo "Here we are \r\n";
  10.  
  11. }

Maintenant je sais pas si c'est chez tout le monde pareil, mais essayez d'utiliser la connexion à la base
vous devriez avoir des surprises ... ce qui en soit est plutot logique puisque vous n'avez pas d'environnement
ni d'application à ce niveau.

Alors je propose un moyen qui marche, si vous en avez un meilleur je suis assez intéressé parce que c'est
pas très classe, mais fallait que ça marche ;-)

  1. if (count($args) == '0') {
  2. echo "Provide at least the environment\r\n";
  3. die();
  4. }
  5. define('SF_ENVIRONMENT', $args[0]);
  6.  
  7. /* get back configuration from global databases.yml */
  8. $yml = sfYaml::load(sfConfig::get('sf_config_dir') . '/databases.yml') ;
  9. Propel::setConfiguration(array('datasources' => array(
  10. 'dev' => array('connection' => $yml['dev']['propel']['param']['dsn']),
  11. 'prod' => array('connection' => $yml['all']['propel']['param']['dsn'])
  12. )));
  13.  
  14. $query = 'whatever';
  15.  
  16. $connection = Propel::getConnection(SF_ENVIRONMENT);
  17. $statement = $connection->prepareStatement($query);
  18. $resultset = $statement->executeQuery();
  19. $results = array();
  20. while( $resultset->next() )
  21. {
  22. /* do something here */
  23. }

Voila cette solution fonctionne pour du pur SQL, oubliez les WhateverPeer::retrieveByPk ou autres fonctions
du framework symfony, elles vont toutes faire appel à des méthodes qui présuposent une configuration
bien remplie, et la j'ai juste feinté l'ouverture d'une connection !