Como quitar el modo mantenimiento por codigo en Drupal 8

Imagen
Herramientas de carpinteria

Esto mas que un truco sobre como quitar el modo mantenimiento, va a ser un repaso a como llegar hasta el código de donde se modifica el valor que indica si Drupal considera si el sitio esta en mantenimiento o no. Comencemos!

TL;DR

//Activar el modo mantenimiento
\Drupal::service('state')->set('system.maintenance_mode', True);
//Quitar el modo mantenimiento
\Drupal::service('state')->set('system.maintenance_mode', False);

Localizar el formulario de mantenimiento

Lo primero de todo, es localizar la ruta desde el backend donde Drupal permite modificar, sabemos que el modo mantenimiento podemos modificarlo en "Configuración -> Desarrollo -> Modo de mantenimiento" y la ruta corresponde a "/admin/config/development/maintenance".

Si buscamos esa dirección en los archivos de Drupal en la carpeta /core, veremos que pertenece a la ruta "system.site_maintenance_mode":

# El codigo corresponde al archivo /core/modules/system/system.routing.yml
system.site_maintenance_mode:
  path: '/admin/config/development/maintenance'
  defaults:
    _form: 'Drupal\system\Form\SiteMaintenanceModeForm'
    _title: 'Maintenance mode'
  requirements:
    _permission: 'administer site configuration'

Si nos fijamos en el valor _form veremos que corresponde al namespace "Drupal\system\Form\SiteMaintenanceModeForm".  Con esto vemos que corresponde al modulo "system", y que al ser una clase, estará en la carpeta "src" del modulo, luego pasamos a la carpeta "Form" dentro de "src" y por ultimo, la clase "SiteMaintenanceModeForm", a si que la ruta completa se nos queda en "/core/modules/system/src/Form/SiteMaintenanceModeForm".

Encontrar el código en la clase:

Ahora que tenemos la clase del formulario, tenemos que buscar el código donde se establezca el campo, esto lo podemos ver en el método "buildForm" ya que en ese método es donde se genera el array con los campos del formulario:

/**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('system.maintenance');
    $permissions = $this->permissionHandler->getPermissions();
    $permission_label = $permissions['access site in maintenance mode']['title'];
    $form['maintenance_mode'] = [
      '#type' => 'checkbox',
      '#title' => t('Put site into maintenance mode'),
      '#default_value' => $this->state->get('system.maintenance_mode'),
      '#description' => t('Visitors will only see the maintenance mode message. Only users with the "@permission-label" permission will be able to access the site. Authorized users can log in directly via the user login page.', ['@permission-label' => $permission_label, ':permissions-url' => $this->url('user.admin_permissions'), ':user-login' => $this->url('user.login')]),
    ];
    $form['maintenance_mode_message'] = [
      '#type' => 'textarea',
      '#title' => t('Message to display when in maintenance mode'),
      '#default_value' => $config->get('message'),
    ];

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

Si nos fijamos, veremos que el indice del array "#default_value" dentro del elemento "maintenance_mode" indica lo siguiente:

'#default_value' => $this->state->get('system.maintenance_mode'),

Viendo esto, vemos que se utiliza el servicio "state" para obtener el valor "system.maintenance_mode" ya que se utiliza el atributo "state" que si nos fijamos veremos que esta creado en el constructor y corresponde al servicio mencionado, state. Podemos saber que corresponde a ese servicio, ya que en el método estático "create" se inyecta el servicio "state".

/**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('config.factory'),
      $container->get('state'),
      $container->get('user.permissions')
    );
  }
 

A si sabiendo utilizar State API (es lo que nos proporciona el servicio 'state'), y que lo que se establece es un valor booleano (verdadero o falso) podemos ver que el código necesario es el siguiente:

//Activar el modo mantenimiento
\Drupal::service('state')->set('system.maintenance_mode', True);
//Quitar el modo mantenimiento
\Drupal::service('state')->set('system.maintenance_mode', False);

Conclusión

Realmente, hacerlo es muy sencillo, una sola linea de código, pero siempre viene bien tener una pequeña guia sobre como se llega a la solución para aprender sobre el proceso, que solamente el resultado y simplemente olvidar el resto.