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

#php #drupal

#php #drupal

Вопрос:

Я очень новичок в Drupal, и меня просят создать форму с кнопкой отправки и службой, которая отправляет запрос get в API со значениями из формы. API — это простой API, в котором пользователь может ввести страну, и он вернет ответ с правильным приветствием из этой страны.

Это мой файл маршрутизации:

 hello_world.salutation:
  path: '/hello'
  defaults:
    _controller: Drupalhello_worldControllerHelloWorldSalutation::salutation
    _form: Drupalhello_worldFormGreetingForm
    _title: 'Get a greeting from a different language'
  requirements:
    _permission: 'administer site configuration'
 

Первая проблема заключается в том, что я не знаю, как создать форму и контроллер в одном и том же маршруте,
а во-вторых, я не знаю, как вызвать эту службу, когда пользователь ввел submit.

Вот мой файл служб:

 services:
  hello_world.salutation:
    class: Drupalhello_worldHelloWorldSalutation
    arguments: [ '@config.factory' ,'@tempstore.private']
  cache.nameofbin:
    class: DrupalCoreCacheCacheBackendInterface
    tags:
      - { name: cache.bin }
    factory: [ '@cache_factory', 'get' ]
    arguments: [ nameofbin ]
 

Я пропущу некоторые строки из класса GreetingFrom, чтобы упростить его, но я могу добавить их, если это необходимо.

Вот функция submitForm из класса GreetingForm . Идея состоит в том, чтобы поместить входные данные в глобальное временное хранилище, чтобы я мог получить доступ к значениям из контроллера, я думаю.

   public function submitForm(array amp;$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),
    ];
  }
 

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

Ответ №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 = DrupalCoreUrl::fromRoute('hello_world.salutation');
$form_state->setRedirectUrl($url);