Note

The online documentation is produced by a web publishing technology created by us to read the documents origins in OpenOffice Writer (ODT) and Microsoft Word (docx) formats and produces native web and PDF versions. In this way we maintain Louder project documentation update and in sync on each of its formats.
Select a Language:
Componente Debug
Introducción
El componente Debug ofrece al desarrollador la posibilidad de realizar seguimiento y obtener información extendida en procesos de negocio de forma tradicional mediante la inserción de banderas en el código para conocer el valor y estado en un determinado punto del mismo. Es una buena práctica realizar previamente test de unidad a los procesos de negocio para automatizar los procesos de testeo mejorando la estabilidad de estos.
Seguimiento al estado de variables
El componente Debug proporciona el método add(mixed $value, $showTrace=false) que permite agregar una variable a la lista de seguimiento. Los valores de seguimiento solo se agregan si el procedimiento trazado ejecuta la línea donde se encuentra el llamado.

En el siguiente ejemplo se envia al seguimiento 2 valores en determinados puntos del proceso. El primero visualiza el contenido de la variable $customerId y el segundo el contenido del vector $customerAccounts;
Ejemplo: Realizar un Debug a un proceso de negocio
<?php

class BankingController extends ApplicationController {

     public function getSelectedActivityAction(){
          $selectedAccountsIds = $this->getPostParam("cuenta");
          $customerAccounts = array();
          if(is_array($selectedAccountsIds)){
               $userData = SessionNamespace::get('UserData');
               $customerId = $userData->getCustomer();
               //Que hay en la variable $customerId?
               Debug::add($customerId);
               foreach($selectedAccountsIds as $accountId){
                    $accountId = $this->filter($accountId, "int");
                    $existsAccount = $this->Account->count("customer_id = '$customerId' AND id='$accountId' AND status='A'");
                    if($existsAccount==true){
                         $customerAccounts[] = $accountId;
                    } else {
                         Flash::error("Cuentas invalidas en la peticion");
                         return;
                    }
               }
          } else {
               Flash::error("Datos invalidos en la peticion");
               return;
          }
          //Que hay en customerAccounts?
          Debug::add($customerAccounts);
          $movements = $this->Movement->find("account_id IN (".join(", ", $customerAccounts).")", "order: created_at DESC");
          $this->setParamToView("movements", $movements);
          new DebugException("Visualizar el Debug");
     }
}

Siempre se requiere que se lance una excepción sin capturar. El componente Debug visualiza el seguimiento sin importar el tipo de excepción generada. En el ejemplo no se produce ninguna excepción por lo que a propósito se lanza un DebugException.

En la pantalla de excepciones ahora se muestra el cuadro llamado "Datos de Debug" como el siguiente:



La primera columna es el orden en el que se agregaron al seguimiento los valores, la segunda es el valor que se pasó al método add(), luego la clase y el método en donde se agregó el debug, la linea, el archivo y por último el tiempo transcurrido entre un seguimiento y otro.
Visualizar la traza del seguimiento de un valor
Para ciertos casos puede que sea importante verificar que métodos se ejecutaron para que un dato se haya agregado al seguimiento. El segundo parámetro de add permite que se muestre la traza asociada al valor de seguimiento.



Los valores resaltados en rosado indican que tienen una traza asociada que aparece a continuación en gris. En la traza es posible visualizar que parámetros recibió cada método ejecutado y en que archivo se encuentra.
Detener un proceso mediante Aserciones
En un proceso de seguimiento también puede ser útil detener el proceso cuando se cumpla una determinada condición. Tomando la idea de los test de unidad es posible insertar aserciones en el proceso. Las aserciones evaluan condiciones y en caso de cumplirse lanzan una excepción de tipo DebugException deteniendo el proceso y mostrando el segumiento hasta ese punto. Todas las aserciones que no se cumplieron también se muestran en el seguimiento. Las aserciones disponibles son:
Tabla: Aserciones soportadas en Debug
Método
Descripción
assertEquals(mixed $val1, mixed $val2, $showTrace=false)Aserción si el valor $val1 es igual a $val2.
assertNotEquals(mixed $val1, mixed $val2, $showTrace=false)Aserción si el valor $val1 no es igual a $val2.
assertNull(mixed $val1, $showTrace=false)Aserción si $val1 es nulo.
assertArray(mixed $val1, $showTrace=false)Aserción si $val1 es un array.
assetTrue(mixed $val1, $showTrace=false)Aserción si $val1 es verdadero.
assertFalse(mixed $val1, $showTrace=false)Aserción si $val1 es falso.


El uso de las aserciones es el siguiente:
Ejemplo: Uso de aserciones en Debug
<?php

$v = 100;
Debug::assertEquals("1", $v); //No se lanza la excepción
Debug::assertNotEquals("1", $v); //Se lanza la excepción
Debug::assertTrue(100==$v); //Se lanza la excepción

$employees = $this->Employees->find("status='A'");
Debug::assertEquals(count($employees), 10); //Se lanza si hay 10 trabajadores
Tomando el ejemplo anterior, el cuadro de debug se visualiza el tipo de aserción y los valores del mismo:

Establecer una acción a ejecutar al finalizar el proceso de debug
El componente Debug puede aprovechar las capacidades para programar eventos del framework para efectuar operaciones al terminar la procesar una determinada petición. Las acciones que se pueden programar son generar una excepción que visualice el contenido del seguimiento ó almacenarlos en un archivo de log:

Para detener la ejecución al finalizar la petición se debe hacer el llamado a:
Ejemplo: Establecer el lanzamiento de una excepción cuando finalice la petición
Debug::setActionOnFinish(Debug::ACTION_HALT);

Utilizar un logger para almacenar el seguimiento:
Ejemplo: Almacenar el seguimiento usando un Logger
$logger = new Logger("File", "debug.txt");
Debug::setActionOnFinish(Debug::ACTION_LOG, $logger);