Drupal 8 - Utiliser la Batch API dans un controller

Posté le Vendredi 13 mai 2016 - 09:16
Dernière mise à jour le Vendredi 9 mars 2018 - 11:10

La batch API dans Drupal permet de faire des traitements lourds et/ou long, sans risque d'avoir un temps d’exécution dépassé de la part de son serveur.

Ici, dans le cadre de mon site de pronostics, je voulais faire un traitement permettant de recalculer les points sur l'ensemble des matchs d'une compétitions.

J'ai donc une route définie qui appelle la méthode statique "updateBetsForLeague" de mon controller.

Fonction de qui prépare le batch à traiter :

  1. public static function updateBetsForLeague(League $league) {
  2. $games = $league->getGames(); //Je récupère l'ensemble des matchs à traiter
  3. //Définition du batch
  4. $batch = [
  5. 'title' => t('Recount League Points'), // Titre de l'opération
  6. 'operations' => [], // tableaux qui contiendra l'ensemble des traitements à effectuer
  7. 'finished' => '\Drupal\mespronos\Controller\BetController::updateBetsForLeagueOver', // méthode qui sera appelé à la fin du traitement
  8. ];
  9. //Définition des opérations
  10. // Pour chaque match ($game) on appelle la méthode "updateBetsFromGame" et on lui passe en paramètre le match en question
  11. foreach ($games as $game) {
  12. $batch['operations'][] = ['\Drupal\mespronos\Controller\BetController::updateBetsFromGame',[$game]];
  13. }
  14. // on paramètre le batch
  15. batch_set($batch);
  16. //et on le lance (en lui passant une url de redirection pour la fin du traitement, ici la liste des compétitions
  17. return batch_process(\Drupal::url('entity.league.collection'));
  18. }

Voici la méthode statique appelée à la fin du batch

  1. public static function updateBetsForLeagueOver($success, $results, $operations) {
  2. if ($success) {
  3. $message = t('Ranking recalculated');
  4. }
  5. else {
  6. $message = t('Finished with an error.');
  7. }
  8. drupal_set_message($message);
  9. return new RedirectResponse(\Drupal::url('entity.league.collection'));
  10. }

Rien de bien compliqué donc, un seul piège dans lequel je suis tombé, lorsque l'on définie une opération, il faut bien donner le namespace complet de la classe, en effet $batch['operations'][] = ['BetController::updateBetsFromGame',[$game]]; ne fonctionnera pas, mais ne retournera même pas d'erreur...

 

Comments

Diego

Posté le Vendredi 13 avril 2018 - 11:30

Bonjour, désolé de te déranger mais pourrai tu me fournir ce module pour que je puisse implémenter un batch s'il te plait.

Merci d'avance.

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...