devel_wizard-2.x-dev/templates/spell/batch_handler/devel-wizard.batch-handler.handler.php.twig
templates/spell/batch_handler/devel-wizard.batch-handler.handler.php.twig
<?php
declare(strict_types=1);
namespace {{ handler.classNamespace }};
use Drupal\Core\Batch\BatchBuilder;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Batch handler for {{ object }} items.
*
* @code
* $batch_builder = {{ handler.className }}::build(10);
* batch_set($batch_builder->toArray());
* @endcode
*/
class {{ handler.className }} implements ContainerInjectionInterface {
use StringTranslationTrait;
protected MessengerInterface $messenger;
public static function build(int $num_of_loops): BatchBuilder {
$batch_builder = new BatchBuilder();
$batch_builder
->setTitle(t('My custom batch process'))
->setFinishCallback([static::class, 'finish'])
->addOperation(
[static::class, 'process'],
[
$num_of_loops,
],
);
return $batch_builder;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('string_translation'),
$container->get('messenger'),
);
}
public function __construct(
TranslationInterface $stringTranslation,
MessengerInterface $messenger,
) {
$this->setStringTranslation($stringTranslation);
$this->messenger = $messenger;
}
/**
* @see \DrushBatchContext
*/
public static function process(int $num_of_loops, array|\ArrayObject &$context): void {
$handler = static::create(\Drupal::getContainer());
$handler->doProcess($num_of_loops, $context);
}
public static function finish(bool $success, array $results, array $operations): void {
$handler = static::create(\Drupal::getContainer());
$handler->doFinish($success, $results, $operations);
}
protected function doProcess(int $num_of_loops, array|\ArrayObject &$context): void {
if (empty($context['sandbox']['initialized'])) {
$context['sandbox']['current_loop'] = 0;
$context['sandbox']['initialized'] = TRUE;
}
// Do something.
sleep(2);
if ($context['sandbox']['current_loop'] === 1) {
$context['sandbox']['results']['messages'][] = [
'message' => 'My msg 02',
'type' => 'warning',
];
}
if ($context['sandbox']['current_loop'] === 4) {
$context['sandbox']['results']['messages'][] = [
'message' => 'My msg 04',
'type' => 'status',
];
}
$context['sandbox']['current_loop']++;
$context['message'] = $this->t(
'Do something @current/@total',
[
'@total' => $num_of_loops,
'@current' => $context['sandbox']['current_loop'],
],
);
$context['finished'] = $context['sandbox']['current_loop'] / $num_of_loops;
if ($context['finished'] >= 1) {
$context['results']['messages'] = $context['sandbox']['results']['messages'] ?? [];
}
}
/**
* @link https://www.drupal.org/project/drupal/issues/604902#comment-4197954
*/
protected function doFinish(bool $success, array $results, array $operations): void {
if (!$success) {
$this->messenger->addError($this->t('Something went wrong'));
}
foreach ($results['messages'] ?? [] as $msg) {
$this->messenger->addMessage($msg['message'], $msg['type']);
}
}
}
