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

