如何在 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);
我是 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);