如何在Drupal8中创建队列工作者

时间:2020-03-05 15:25:35  来源:igfitidea点击:

队列API允许在队列中放置项目并在以后处理它们。
如果我们有一个必须定期完成的任务,并且需要更多的时间来完成,那么Cron queue可能是更好的解决方案。

在Drupal8中,hook_cron_queue_info()已被QueueWorker插件替换。
通过在插件文件夹中创建QueueWorker文件夹来定义队列工作线程。
在下面的示例中,我创建了一个用于发送电子邮件的表单。
电子邮件将通过提交表单添加到队列中。
在cron上运行的电子邮件将被取消排队。

src/Plugin/QueueWorker

在该文件夹中,创建QueueWorker文件电子邮件队列.php.

<?php
/**
 * @file
 * Contains \Drupal\mymodule\Plugin\QueueWorker\EmailQueue.
 */
namespace Drupal\Learning\Plugin\QueueWorker;
use Drupal\Core\Queue\QueueWorkerBase;
/**
 * Processes Tasks for Learning.
 *
 * @QueueWorker(
 *   id = "email_queue",
 *   title = @Translation("Learning task worker: email queue"),
 *   cron = {"time" = 60}
 * )
 */
class EmailQueue extends QueueWorkerBase {
  /**
   * {@inheritdoc}
   */
  public function processItem($data) {
    $mailManager = \Drupal::service('plugin.manager.mail');
    $params = $data;
    $mailManager->mail('learning', 'email_queue', $data['email'], 'en', $params , $send = TRUE);
  }
}

自定义QueueWorker类必须扩展QueueWorkerBase,并应实现processItem()方法。
电子邮件将被添加到"电子邮件"队列中"

创建用于发送包含电子邮件、主题、消息字段的电子邮件的表单。

src/表格/表单队列.php:

在此文件夹中,创建电子邮件表单表单队列.php

<?php
/**
 * @file
 * Contains \Drupal\Learning\Form\FormQueue.
 */
namespace Drupal\learning\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
/**
 * Contribute form.
 */
class FormQueue extends FormBase {
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
     return 'queue_forms';
  }
  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['email'] = array(
      '#type' => 'textfield',
      '#title' => t('Email'),
      '#required' => TRUE,
    );
    $form['subject'] = array(
      '#type' => 'textfield',
      '#title' => t('Subject'),
      '#required' => TRUE,
    );
    $form['message'] = array(
      '#type' => 'textarea',
      '#title' => t('Message'),
      '#required' => TRUE,
    );
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Submit'),
    );
    return $form;
  }
  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    //Validate email
    if (!valid_email_address($form_state->getValues()['email'])) {
       $form_state->setErrorByName('Email', $this->t('Email address is not a valid one.'));
    }
  }
  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $data['email'] = $form_state->getValues()['email'];
    $data['subject'] = $form_state->getValues()['subject'];
    $data['message'] = $form_state->getValues()['message'];
    $queue = \Drupal::queue('email_queue');
    $queue->createQueue();
    $queue->createItem($data);
  }
}
?>

在submitForm()中,我们正在创建队列email_Queue并将$data添加到包含email、subject和message的队列中。

/**
 * Implements hook_mail().
 */
function learning_mail($key, &$message, $params) {
  switch ($key) {
    //Send a simple message from the contact form.
    case 'email_queue':
      $message['subject'] = SafeMarkup::checkPlain($params['subject']);
      $message['body'][] = SafeMarkup::checkPlain($params['message']);
      break;
  }
}

在"队列"表中,可以看到添加到队列中的项目列表。