如何在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; } }
在"队列"表中,可以看到添加到队列中的项目列表。