Рейтинг:1

Аргумент формы Drupal\terminal\Form\TerminalCliForm не является допустимой формой

флаг cl

Я прочитал другие вопросы, касающиеся того же сообщения об ошибке. Все они, кажется, в конечном итоге из-за опечаток или пути к файлу. Не думаю, что это так, но посмотрим. У меня есть рабочий экземпляр того же кода, если не считать имен, что еще больше сбивает с толку.

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

InvalidArgumentException: Аргумент формы Drupal\terminal\Form\TerminalCliForm не является допустимой формой. в Drupal\Core\Form\FormBuilder->getFormId() (строка 197 core/lib/Drupal/Core/Form/FormBuilder.php).

Я проверил, что getFormId получает пустой form_id. Я читал, что это сообщение об ошибке указывает не на плохую форму в этих конкретных случаях, а на то, что файл формы не может быть найден. Я не уверен, в чем здесь дело.

/модули/обычай/терминал/SRC/Форма/TerminalCliForm

пространство имен Drupal\terminal\Form;

используйте Drupal\Core\Form\FormBase;
используйте Drupal\Core\Form\FormStateInterface;

/**
 * Класс TerminalCliForm.
*/
класс TerminalCliForm расширяет FormBase {

  /**
   * {@inheritdoc}
  */
  публичная функция getFormId() {
    вернуть 'terminal_cli_form';
  }

  /**
   * {@inheritdoc}
  */
  общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
    $form['#attached']['библиотека'][] = 'терминал/терминал';
    $ форма ['холст'] = [
      '#тип' => 'текстовое поле',
    ];
    $ форма ['командная строка'] = [
      '#тип' => 'текстовое поле',
    ];
    вернуть $ форму;
  }

  /**
   * {@inheritdoc}
  */
  общедоступная функция validateForm (массив и $ форма, FormStateInterface $ form_state) {
    // Ничего такого.
  }

  /**
   * {@inheritdoc}
  */
  публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
  }

}

/modules/custom/terminal/src/Plugin/Block/TerminalCliBlock — я пробовал это с оператором использования и без него для класса формы. В другом корректно работающем модуле он присутствует.

    пространство имен Drupal\terminal\Plugin\Block;

    используйте Drupal\Core\Block\BlockBase;
    используйте Drupal\terminal\Form\TerminalCliForm;

    /**
     * Предоставляет блок «CliBlock».
     *
     * @Блокировать(
     * id = "terminal_cli_block",
     * admin_label = @Translation("CLI-блок"),
     * категория = @Translation("Блок двигателя")
     * )
    */

    класс TerminalCliBlock расширяет BlockBase {

     /**
      * {@inheritdoc}
     */
     общедоступная функция сборки () {

       $form = \Drupal::formBuilder()->getForm(TerminalCliForm::class);

       вернуть $ форму;
     }
   }
флаг vg
Вы скопировали и вставили имена файлов (и расположение) или напечатали их? (Могу поспорить, что в именах папок или файлов есть опечатка ;))
флаг cl
web/modules/custom/terminal/src/Form/TerminalCliForm.php и web/modules/custom/terminal/src/Plugin/Block/TerminalCliBlock.php, вставленные из PhpStorm.
Jaypan avatar
флаг de
Этот файл: `/modules/custom/terminal/src/Form/TerminalCliForm` должен иметь расширение файла `.php`.
флаг cl
Они оба имеют расширение .php, как вставлено выше из PhpStorm.
флаг cn
Похоже, что PHP не может найти класс (`class_exists()` не работает в `FormBuilder::getFormId()`). Если имена файлов определенно верны, попробуйте перезапустить веб-сервер/службу PHP — иногда APC может запутаться и потребовать перезагрузки.
флаг cl
Это сделало это @Clive. Очистка кеша - нет, а вот остановка и перезапуск доксала - да! Пожалуйста, опубликуйте это как ответ.

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

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