Я очень новичок в Drupal, и меня просят создать форму с кнопкой отправки и службой, которая делает запрос на получение к API со значениями из формы. API — это простой API, в который пользователь может ввести страну, и он вернет ответ с правильным приветствием из этой страны.
Это мой файл маршрутизации:
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 для простоты, но могу добавить их, если это необходимо.
Вот функция submitForm из класса GreetingForm. Идея состоит в том, чтобы поместить ввод в глобальное временное хранилище, чтобы я мог получить доступ к значениям из контроллера, я думаю.
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)
?
Из предоставленных деталей я не могу точно сказать, зачем вам нужен Контроллер, но если вам нужно перенаправить на Контроллер, то вы можете создать отдельный маршрут для своего метода HelloWorldSalutation::salutation()
и перенаправить на него из GreetingForm ::submitForm()
через объект $form_state
:
$url = \Drupal\Core\Url::fromRoute('hello_world.salutation');
$form_state->setRedirectUrl($url);