Gyors és ronda módszer meglévő PHP alkalmazás Drupal 8 modulba csomagolására

A napokban szükségem volt egy régi, PHP 5.4 idején készített alkalmazás Drupal 8 modulba konvertálására. A munkára nem akartam sok időt és energiát szánni, ezért egy nagyon gyors, viszont ronda módszert választottam. Az elkészült Drupal modul hamar működő képes lesz, azonban még rengeteg munkára lenne szükség, hogy mara­dék­talanul megfeleljen az MVC szabályoknak.

A modul keretéhez követhetjük a szokásos dokumentációt. A blokk rész előtt már lesz egy Controller, ami valahogy így fest:

<?php

namespace Drupal\hello_world\Controller;

use Drupal\Core\Controller\ControllerBase;

class HelloController extends ControllerBase {

  /**
   * Display the markup.
   *
   * @return array
   */
  public function content() {
    return [
      '#type' => 'markup',
      '#markup' => $this->t('Hello, World!'),
    ];
  }

}

Ennyi már elég nekünk a működéshez. A render array-t ki tudjuk bővíteni néhány opcióval, hogy tökéletesen fel tudjuk használni a meglévő PHP kódot. Az egyik ilyen fontos opció az #allowed_tags. A markup típusú rendernél a HTML tagek legtöbbjét elveszítjük a szigorú XSS szűrés miatt, de az #allowed_tags kulcsban fel tudjuk sorolni az összes taget, amire szükségünk van. Így meg tudjuk jeleníteni a teljes alkalmazást. A másik fontos opció pedig a #cache. A max-age-et érdemes 0-ra állítani, hogy a dinamikus tartalom valóban dinamikus maradjon. Ha ezt kifelejtjük, akkor a Drupal elmenti az éppen adott kimenetet, és bármi történik az alkalmazáson belül, az nem fog frissülni a renderelésnél.

A módosított render array így fog kinézni:

<?php

namespace Drupal\idopontfoglalo\Controller;

use Drupal\Core\Controller\ControllerBase;

class Idopontfoglalo extends ControllerBase {

  /**
   * Display the markup.
   *
   * @return array
   */
  public function content() {
    // Betöltjük a meglévő alkalmazás fájljait.
    $m_path = drupal_get_path('module', 'idopontfoglalo');
    require_once $m_path . '/src/legacy/app.php';

    // Betöltjük a tartalmat egy változóba.
    $content = betolt_tartalom();

    return [
      '#type' => 'markup',
      '#markup' => $content,
      '#allowed_tags' => [
        'fieldset', 'form', 'input', 'select', 'option', 'textarea',
        'label', 'legend',
        'a', 'br', 'p', 'strong',
        'table', 'th', 'tr', 'td',
        'div',
        'ul', 'li',
        'h1', 'h2',
      ],
      '#cache' => [
        'max-age' => 0,
      ],
    ];
  }
}

Ennyire van szükségünk, hogy a meglévő PHP alkalmazást be tudjuk tölteni a Drupal modulba. Az alkalmazásunk többé-kevésbé érintetlenül tovább tud élni az src/legacy mappában, akármilyen ronda is maradhat a felépítése, a Drupal meg fogja jeleníteni.