如何在 Drupal 中按下提交后调用服务

How to invoke a service after pressing submit in Drupal

我是 Drupal 的新手,我被要求创建一个带有提交按钮的表单和一个使用表单中的值向 API 发出获取请求的服务。 API 是一个简单的 API,用户可以输入一个国家,它会 return 一个带有来自该国家的正确问候语的响应。

这是我的路由文件:

hello_world.salutation:
  path: '/hello'
  defaults:
    _controller: Drupal\hello_world\Controller\HelloWorldSalutation::salutation
    _form: Drupal\hello_world\Form\GreetingForm
    _title: 'Get a greeting from a different language'
  requirements:
    _permission: 'administer site configuration'

第一个问题是我不知道如何在同一个路由中制作表单和控制器, 其次是我不知道如何在用户输入提交时调用该服务。

这是我的服务文件:

services:
  hello_world.salutation:
    class: Drupal\hello_world\HelloWorldSalutation
    arguments: [ '@config.factory' ,'@tempstore.private']
  cache.nameofbin:
    class: Drupal\Core\Cache\CacheBackendInterface
    tags:
      - { name: cache.bin }
    factory: [ '@cache_factory', 'get' ]
    arguments: [ nameofbin ]

为了简单起见,我将跳过 GreetingFrom class 中的一些行,但如果需要,我可以添加它们。

这是来自 GreetingForm class 的 submitForm 函数。我的想法是将输入放在一个全局临时存储中,这样我就可以从我猜的控制器中访问值。

  public function submitForm(array &$form, FormStateInterface $form_state)
  {
    $search_str = $form_state->getValue('greeting');
    // check the input
    $params['items'] = $form_state->getValue('greeting');
    // 2. Create a PrivateTempStore object with the collection 'greetingForm_values'.
    $tempstore = $this->tempStoreFactory->get('greetingForm_values');
    // 3. Store the $params array with the key 'params'.
    try {
      $tempstore->set('params', $params);
    } catch (\Exception $error) {
      // dump the error for now, read error, --fix this!
      dpm($error);
    }
  }

来自控制器的称呼函数如下所示:

  public function salutation()
  {
    $tempstore = $this->tempStoreFactory->get('greetingForm_values');
    $params = $tempstore->get('params'); // this value should come from the search form
    return [
      '#markup' => $this->salutation->getGreeting($params),
    ];
  }

非常感谢任何帮助,如果需要,请询问更多信息。

路由文件

在您的用例中,我相信您可以坚持使用表单。请从您的 hello_world.salutation 路由中丢弃控制器规范,因为它应该是 _form_controller,而不是同时用于单个路由。

服务方法调用

对于您的服务定义,您可以通过将服务静态调用为:

$salutation_service = \Drupal::service('hello_world.salutation');
$salutation_service->somePublicMethodCall();

或者通过依赖注入,当我看到 this->salutation->getGreeting($params)?

时,我假设你已经在做

表单 x 控制器

根据提供的详细信息,我无法真正说明您为什么需要 Controller,但是如果您需要重定向到 Controller,那么您可以为 HelloWorldSalutation::salutation() 方法创建一个单独的路由并重定向到它来自 GreetingForm ::submitForm() 通过 $form_state 对象:

$url = \Drupal\Core\Url::fromRoute('hello_world.salutation');
$form_state->setRedirectUrl($url);