back

Knowlegde

Knowledge Centre

Procesul Batch în Drupal 8: De ce și când ar trebui să îl folosești

by editor | 25.02.2025

Procesul Batch în Drupal 8: De ce și când ar trebui să îl folosești

În unul dintre proiectele noastre Drupal 8, a trebuit să implementăm un proces batch. Să explorăm ce sunt procesele batch în Drupal 8 și să înțelegem cum și când să le folosim eficient.

Un proces batch execută o serie de operațiuni fără a necesita interacțiunea utilizatorului. Procesează datele în "loturi" discrete sau seturi de intrări, de unde și numele. Această abordare permite gestionarea operațiunilor la scară largă care altfel ar putea fi nepractice sau imposibil de finalizat într-o singură cerere.

De ce să folosim un proces batch?

Procesele batch sunt deosebit de valoroase când gestionăm cantități mari de date care, în mod normal, ar cauza o depășire de timp PHP în execuția normală. Ele descompun operațiunile extinse în bucăți gestionabile, asigurând procesarea fiabilă și oferind feedback privind progresul utilizatorilor.

Să explorăm un scenariu practic: Imaginați-vă că aveți o vizualizare care filtrează tipurile de conținut de articole unde `field_boring` este setat la TRUE, și doriți să le ștergeți pe toate. Cu peste 500 de articole care se potrivesc, ștergerea manuală ar fi consumatoare de timp și ineficientă. Să implementăm un proces batch pentru a gestiona această sarcină automat.

Componente necesare

Pentru a implementa procesul nostru batch, avem nevoie de trei fișiere:

  1. Un controller (Delete.php)
  2. Fișier de informații modul (module.info.yml)
  3. Configurare de rutare (module.routing.yml)

Să creăm fiecare componentă:

Mai întâi, creăm fișierul de informații al modulului:

# module.info.yml
name: Delete
description: 'Delete articles'
core: 8.x
type: module
package: Custom

În continuare, configurăm rutarea pentru a gestiona cererile către '/delete-boring-articles':

# module.routing.yml
module.delete:
 path: '/delete-boring-articles'
 defaults:
   _controller: '\Drupal\module\Controller\Delete::delete'
   _title: 'Delete boring articles'
 requirements:
   _permission: 'administer node'

În final, să creăm controllerul nostru care gestionează procesul de ștergere:

<?php
namespace Drupal\module\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Provides batch operations for deleting articles.
*/
class Delete extends ControllerBase {
 /**
  * Initiates the batch process for deleting articles.
  *
  * @return array
  *   Returns a batch array.
  */
 public function delete() {
   // Get results from our view.
   $view_results = views_get_view_result('boring_articles', 'page_1');
   $operations = [];
   // Build the operations array from view results.
   foreach ($view_results as $result) {
     $operations[] = [
       [$this, 'batchFunction'],
       [$result->_entity->id()],
     ];
   }
   $batch = [
     'title' => $this->t('Deleting articles'),
     'operations' => $operations,
     'finished' => [$this, 'finishedCallback'],
     'progressive' => TRUE,
   ];
   batch_set($batch);
   return batch_process();
 }
 /**
  * Processes a single node deletion.
  *
  * @param int $id
  *   The node ID to delete.
  * @param array $context
  *   The batch context array.
  */
 public function batchFunction($id, &$context) {
   try {
     $node = Node::load($id);
     if ($node) {
       $node->delete();
       $context['results'][] = $id;
       $context['message'] = $this->t('Deleted article with ID: @id', ['@id' => $id]);
     }
   }
   catch (\Exception $e) {
     $context['error_messages'][] = $this->t('Error deleting article @id: @message', [
       '@id' => $id,
       '@message' => $e->getMessage(),
     ]);
   }
 }
 /**
  * Handles batch completion.
  *
  * @param bool $success
  *   Indicates whether the batch process completed successfully.
  * @param array $results
  *   An array of processed node IDs.
  * @param array $operations
  *   An array of unprocessed operations.
  */
 public function finishedCallback($success, $results, $operations) {
   if ($success) {
     $message = $this->t('Successfully deleted @count articles.', [
       '@count' => count($results),
     ]);
     $this->messenger()->addMessage($message);
   }
   else {
     $message = $this->t('An error occurred while deleting articles.');
     $this->messenger()->addError($message);
   }
   return new RedirectResponse('/admin/content');
 }
}

Îmbunătățiri cheie în cod

  1. Gestionarea corectă a erorilor: Am adăugat blocuri try-catch pentru a gestiona potențialele erori în timpul ștergerii nodurilor.
  2. Utilizarea contextului: Am implementat utilizarea corectă a contextului batch pentru a urmări progresul și rezultatele.
  3. Injecția de dependențe: Am utilizat corespunzător serviciile de traducere și mesagerie încorporate în Drupal.
  4. Siguranța tipurilor: Am adăugat indicii de tip corespunzătoare și blocuri de documentație.
  5. Urmărirea progresului: Am adăugat mesaje semnificative de progres în timpul execuției batch-ului.
  6. Finalizare curată: Am îmbunătățit callback-ul de finalizare pentru a oferi feedback util.

Note importante

  1. Testați întotdeauna procesele batch în mod amănunțit într-un mediu de dezvoltare mai întâi.
  2. Luați în considerare adăugarea unui pas de confirmare înainte de inițierea procesului batch.
  3. Nu uitați să faceți backup la baza de date înainte de a rula operațiuni distructive.
  4. Monitorizați utilizarea memoriei când lucrați cu seturi de date foarte mari.

Concluzie

Procesele batch în Drupal 8 oferă o soluție robustă pentru gestionarea operațiunilor consumatoare de timp care altfel ar depăși timpul de execuție sau ar suprasolicita resursele serverului. Prin descompunerea operațiunilor mari în bucăți gestionabile, putem procesa cantități semnificative de date în mod fiabil, ținând utilizatorii informați despre progres.

Dacă întâmpinați probleme cu implementarea sau aveți întrebări, nu ezitați să lăsați un comentariu mai jos.

drupal 8 batch process
Top
  • Knowlegde
    Knowledge Centre
    Extinde validarea câmpurilor cu expresii regulate
    editor
  • Knowlegde
    Knowledge Centre
    Înțelegerea arhitecturii CMS decuplate complet vs. decuplate progresiv
    editor
  • Knowlegde
    Knowledge Centre
    AngularJS sau Angular: Înțelegerea diferențelor și luarea deciziei corecte
    editor