Como criar um formulário no Drupal 8 via programação

Com a Orientação a Objetos no Drupal 8, alguns hooks deixaram de existir, tornando a vida do programador ainda mais fácil, como vamos ver agora ao criar um formulário via programação no Drupal 8.

O hook_form deixou de existir no Drupal 8. Agora, basta estender a classe "FormBase" e implementar seu formulário.

Segue abaixo a estrutura do meu módulo custom:

Dentro do arquivo "custom_form.info.yml", vamos deixar as informações do módulo:

name: Custom Form
type: module
description: 'Cria um formulário custom via programação'
package: Custom
core: 8.x

No arquivo "custom_form.routing.yml", vamos informar a url de acesso ao formulário, sua classe, título e regra de acesso:

custom_form:
  path: '/custom/form'
  defaults:
    _form: '\Drupal\custom_form\Form\CustomForm'
    _title: 'Custom Form'
  requirements:
    _permission: 'access content'
 
Em seguida, no arquivo "CustomForm.php", vamos implementar o formulário custom:
 
<?php

/**
 * @file
 * Contains \Drupal\custom_form\Form\CustomForm.
 */

namespace Drupal\custom_form\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Custom form example.
 */
class CustomForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'custom_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $options = array('php' => 'PHP','js' => 'JavaScript');

    $form['custom_form']['label'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Name'),
      '#maxlength' => 64,
      '#required' => TRUE,
    );

    $form['custom_form']['description'] = array(
      '#type' => 'textarea',
      '#title' => t('Description'),
    );

    $form['custom_form']['select'] = array(
      '#title' => $this->t('Select Example'),
      '#type' => 'select',
      '#multiple' => FALSE,
      '#size' => 1,
      '#options' => $options,
    );

    $form['custom_form']['radios'] = array(
      '#type' => 'radios',
      '#title' => $this->t('Radios Example'),
      '#required' => TRUE,
      '#default_value' => 'php',
      '#options' => $options,
    );

    $form['custom_form']['save'] = array(
      '#type' => 'submit',
      '#value' => $this->t('Save'),
    );

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    if ($form_state->isValueEmpty('description')) {
      $form_state->setErrorByName('customFormEmpty', $this->t('Description is required'));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    //Your actions here!
    foreach ($form_state->getValues() as $key => $value) {
        drupal_set_message($key . ': ' . $value);
      }
    }

}
 

Feito isso, habilite o módulo e acesse a url "/custom/form" para ver o resultado final.

Até o próximo tutorial, galera!