Как вызвать службу после нажатия кнопки «Отправить» в Drupal

Я очень новичок в 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),
    ];
  }

Любая помощь очень ценится, и, пожалуйста, запросите дополнительную информацию, если она необходима.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
256
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Файл маршрутизации

Я считаю, что в вашем случае использования вы можете придерживаться формы. Пожалуйста, удалите спецификацию контроллера из вашего маршрута hello_world.salutation, потому что это должно быть либо _form, либо _controller, а не оба для одного маршрута.

Вызов метода службы

Для определения службы вы можете сделать это, либо статически вызвав службу как:

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

или через внедрение зависимостей, которое, как я предполагаю, вы уже делаете, когда я смотрю на this->salutation->getGreeting($params)?

Форма x Контроллер

Из предоставленных деталей я не могу точно сказать, зачем вам нужен Контроллер, но если вам нужно перенаправить на Контроллер, то вы можете создать отдельный маршрут для своего метода HelloWorldSalutation::salutation() и перенаправить на него из GreetingForm ::submitForm() через объект $form_state:

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

Другие вопросы по теме