Рейтинг:-2

InvalidArgumentException: класс... не существует в пользовательской форме конфигурации

флаг id

Я создаю форму конфигурации, чтобы динамически устанавливать ключ API для своего пользовательского модуля погоды.

Но когда я пишу в URL адрес http://drupalsite/admin/config/services/weather/settings Я получаю сообщение об ошибке:

InvalidArgumentException: класс "\Drupal\weather\Form\WeatherSettingsForm" не существует. в Drupal\Core\DependencyInjection\ClassResolver->getInstanceFromDefinition() (строка 24 core/lib/Drupal/Core/DependencyInjection/ClassResolver.php).

Я проверил имя класса и имя файла и очистил кеши, но ошибка не исчезла. Как это исправить?

погода.routing.yml

погода.weather_page:                               
  путь: '/погода/{город}'
  значения по умолчанию:                                                       
    _controller: '\Drupal\weather\Controller\WeatherPage::getWeather'                          
  требования:                                        
     _permission: 'доступ к содержимому'
погода.настройки:
  путь: '/admin/config/services/weather/settings'
  значения по умолчанию:
    _form: '\Drupal\weather\Form\WeatherSettingsForm'
    _title: 'Форма настроек погоды'
  требования:
    _permission: «администрирование конфигурации сайта»

WeatherSettingsForm.php

<?php

namespace Drupal\weather\Form;         

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Configure example settings for this site.
 */
class WeatherSettingsForm extends ConfigFormBase {      
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'weather_admin_settings';
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'weather.settings',
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('weather.settings');

    $form['weather_api_key'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('API Key'),
      '#default_value' => $config->get('weather_api_key'),
    );

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $this->configFactory->getEditable('weather.settings')
      ->set('weather_api_key', $form_state->getValue('weather_api_key'))
      ->save();

    parent::submitForm($form, $form_state);
  }
}
?>
флаг cn
Предполагая, что имя вашего модуля — «погода», переместите класс формы в «module_path/src/Form/».
bimsalrobit avatar
флаг id
@Clive Извините, может быть, я вас не понял, но вы говорите, что мне нужно переместить файл «WeatherSettingsForm.php», который содержит класс «WeatherSettingsForm», в папку «modules/custom/weather/src/Form»? Но этот файл есть: https://i.postimg.cc/KYqv3NYp/sc.png
Lambic avatar
флаг ph
Я запустил код, как опубликовано, и он у меня работает, так что, возможно, у вас где-то локально опечатка, или, может быть, где-то попал скрытый символ.
bimsalrobit avatar
флаг id
@Lambic В какой версии drupal вы запускали код?
Lambic avatar
флаг ph
Мы на версии 9.1
bimsalrobit avatar
флаг id
@Lambic Я нашел решение проблемы, мне просто пришлось перезапустить docker4drupal.
Matoeil avatar
флаг za
добавить $settings['class_loader_auto_detect'] = FALSE; в local.settings.php
Рейтинг:1
флаг id

Решение:

Мне просто нужно было перезапустить docker4drupal.

Когда я написал команды:

docker-compose остановить
docker-compose up -d

Ошибка исчезла.

Kevin avatar
флаг in
Вы не очищали кеш после внесения изменений? Перезапуск веб-серверов (крайне редко) для разработки.
bimsalrobit avatar
флаг id
@ Кевин, да, конечно, я очистил кеш после внесения изменений.
Kevin avatar
флаг in
Что-то еще не так или произошло тогда, потому что перезапуск сервера для просмотра изменений не является нормальным, если только вы не включили модуль (регистрация путей классов) и затем не переместили некоторые файлы. Иногда может потребоваться перезагрузка, чтобы стереть кеш пути к классу.
флаг ve
Потерял полчаса с этим :( Большое спасибо

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.