Debug scripts Drupal con PhpStorm

29/06/2015
Debug scripts Drupal con PhpStorm
Como se puede deducir del título se va a plantear un contexto en el que vamos a tener un portal web realizado en Drupal y un entorno de desarrollo PhpStorm con un proyecto creado con el código de nuestro portal.
 
En muchas ocasiones nos vemos obligados a realizar tareas repetitivas en nuestros entornos. Estas tareas no son directamente la funcionalidad de la aplicación pero se erigen necesarias para preparar escenarios o para encuadrar el marco adecuado para probar cierta funcionalidad. Es por esto que se nos hace útil tener pequeños programas que cambien o adapten elementos, programas externos implementados en php que pueden requerir de funciones o servicios implementados en los módulos de nuestro portal Drupal.
 
Y ahora se plantea el siguiente paso, si tenemos un programa vamos a necesitar depurarlo para localizar posibles errores, optimizarlo o mejorar su completitud. La solución a este problema nos la proporciona la conjunción entre PhpStorm y XDebug.
 
A continuación se va ha describir dos situaciones: en una de ellas se especifica cómo depurar un script php que hace uso solo de módulos o librerías nativos de PHP y por otro lado detallaremos cómo depurar un script php que aparte de usar la potencia de PHP requiere el uso de recursos propios de nuestro portal Drupal.
 

Debug scripts PHP

Configurar una instancia de depuración para el script

Para configurar la instancia en PhpStorm debemos hacer los siguientes pasos:
  • Ir al menú “Run/Edit Configurations”
  • Hacer clic en el botón “add New Configuration”
  • Elegir la opción “PHP script”
  • En la siguiente pantalla
 
Se debe rellenar como mínimo 3 parámetros para que sea operativo:
  • Name: será el nombre de la instancia.
  • File: debe indicar la ruta en la que se encuentra el script que queremos depurar.
  • Arguments: debe contener los valores literales que recibe el script por consola (uno en cada línea y respetando el mismo orden).
Lanzar la depuración de los scripts
Una vez configurada nuestra instancia, desde el menú “Run” podremos ejecutar (Run <nombre_instancia>) o depurar (Debug <nombre_instancia>).
  • Run: Esta primera opción devuelve en la parte inferior los resultados de la ejecución completa del script como si en una consola se estuviese lanzando.
Recordamos que esta opción sin usar un entorno de desarrollo se podría realizar lanzando el siguiente comando, bajo la instalación base de drupal (server/drupal_name/sites/all/*). Requiere haber instalado previamente Drush:
drush php-script <nombre_del_script>
 
  • Debug: Para depurarlo sólo basta poner los “breakpoints” y seguir paso a paso como en una depuración normal, con las opciones que aparecen en la parte inferior en la ventana de depuración.

Debug scripts PHP Drupal

En este caso la configuración de la instancia de depuración no sufre cambios, es igual que para el caso anterior de Scripts Php.
 

Lanzar la depuración de los scripts

Cuando queremos depurar desde PhpStorm scripts que contienen elementos propios de drupal, nos encontramos con el problema de que no reconocería a priori: funciones del core, conexión con la base de datos, uso de servicios, variables, constantes, entre otros. Por tanto no sería posible depurar ni ejecutar.
 
Para poder ejecutar y depurar debemos incluir el siguiente código al inicio de nuestros scripts. Haciendo esto se cargaría el “bootstrap” de drupal para poder hacer uso de los elementos propios de drupal que estén presente en el código.
 
// SET DRUPAL BASICS
// Your drupal root directory must be one of those defined here.
$DRUPAL_ROOT = '<path drupal folder>';
 
// SET TIME AND MEMORY LIMITS (if necessary)
set_time_limit(0);
ini_set('memory_limit', '2048M');
 
// HANDLE PARAMETERS (if necessary)
 
// BOOTSTRAP DRUPAL
$bootstrap_inc = 'includes/bootstrap.inc';
$drupal_base = '';
 
// Set drupal root as $DRUPAL_ROOT
if (is_dir($DRUPAL_ROOT) && is_file($DRUPAL_ROOT . "/" . $bootstrap_inc)) {
    chdir($DRUPAL_ROOT);
    $drupal_base = $DRUPAL_ROOT;
}
if (!$drupal_base) {
    $message = "[Error]:
    $droot/$bootstrap_inc not found. Please check that your local drupal
    root directory is defined in DRUPAL_ROOT variable\n";
    print $message;
    exit(1);
}
 
$_SERVER['PHP_SELF'] = getcwd() . "./index.php";
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['REQUEST_METHOD'] = NULL;
require_once "./" . $bootstrap_inc;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Una vez esto añadido, se puede seguir los mismos pasos para depuración y ejecución, descritos para Scripts Php.

Como se puede ver con poca configuración y teniendo claro un par de conceptos básicos es posible crear/corregir scripts con la inestimable ayuda de la depuración y con toda la potencia de recursos de nuestra aplicación.