Exceptiones PHP personalizadas con LaraException

La definición


Cuando se desarrolla un software surge la necesidad de tener a la mano una herramienta que permita generar excepciones de forma controlada para salir del flujo normal de la aplicación enviando al usuario a una ventana o pagina diferente y en caso de ser necesario mostrar un mensaje o simplemente generar un log.

El ejemplo


Digamos tenemos una pagina web y en esa pagina web tenemos un blog y en la parte final las personas que entraran al post pueden realizar comentario, el comentario en la base de datos esta relacionada con el post es decir una relajación de uno a muchos. En resumen para crear un post se necesita saber a que post ve a pertenecer ese dato lo envía el usuario cuando le da en el botón de comentar.

Ahora el controlador o código php que recibirá los parámetros del post entre ellos ira

  • Id del post
  • comentario

En este momento lo que seria seria buscar en la base de datos el post con el id del post y luego crear el comentario con respecto a ese post.

Ahora el problema surge cuando se busca el post y este no existe y se ignora este y se crea el comentario sin hacer tener en cuenta que el post no existe. El usuario que envio el comentario los mas probablemente que tenga en su pantalla es en este caso es información importante de debug y para alguien que probablemente no sepa pues se puede asustar o pensar que la pagina tiene problemas y el usuario se sentirá inseguro. 

Pero si es un usuario que tiene conocimientos sabe que son los errores que lo pudieron producir, podría llegar modificar los parámetros que se enviar en la petición y dar un F5 para que se vuelva a ejecutar la solicitud el modificando el id del post y pudiendo inyectar codigo para modificar crear u actualizar la baser de datos.

La solución 


Algunos frameworks como Laravel ya realizan una "limpieza" y "purificación" a las consultas que se realizan a las base de datos evitando la inyección SQL.

Pero mucha gente un sigue programando en PHP puro o utiliza algún framework pero que no tiene esto o utiliza un driver de conexión que no es eficaz, por que ya PHP tiene igual drivers de conexión que evitan esto, esto ultimo por que siguen usando versiones de PHP antiguas cuando hablamos de PHP 6 hacia abajo.

Como buena practica lo primero seria tener claro el diver de conexión y las funciones que tiene a la mano dicho driver para realizar el query que en la actualidad en php seria usar PDO(PHP Data Objects).

Lo importante seria tener el resultado del query en una variable, algo como esto:

$post = Post::find($decodeID[0]);

Con esto el resultado del query a la base de datos se almacena en la variable post la cual ahora con un simple if se valida si es null lo que quiere decir que no existe en la base de datos:

if(is_null($post)){
    //Excepcion
}
//Ejecución del flujo normal (crear el comentario)

Entonces si se cumple se debería generar una Excepcion que saque al usuario del flujo normal de trabajo si no a otra vista o ventana pero que sea bonita agradable para el usuario que muestre un poco de información de por que esta hay, como por ejemplo:

Imagen relacionadaResultado de imagen para error 404Resultado de imagen para error 404



LaraException




Es un paquete desarrollado en PHP para el framework Laravel para que este sea implementado em proyecto sin embargo se esta viendo la posibilidad para que funcione en otros paquetes para y este paquete pueda se utilizando por un proyecto que ya tiene LaraException sin causar conflictos.

El paquete se encuentra en GitHub.

https://github.com/FuriosoJack/LaraException





Se resume asi:

Es un generador de excepciones, su fin es lanzar excepciones controladas al usuario con la posibilidad de generar log detallados al desarrollador. El paquete es capaz de detectar una application/json de una petición http por defecto. Este paquete entrega al usuario una vista en caso de ser http normal en donde se vera mensaje del error y un código de error, si la petición es JSON el error sera devuelto en un response en formato JSON.

Para el anterior ejemplo LaraException seria perfecto por que necesitamos generar una excepción por que el post no existe. 



Instalacion


Para los artesanos que programamos este comando ya es conocido ejecutamos el comando

composer require furiosojack/lara-exception




Pero bueno hay quienes son mas intrepidos, pues les tengo un reto añadan esto en su composer.json

{
    "require": {
        "furiosojack/lara-exception": "^1.0.0"
    }
}



y luego ejecute un

composer update




Ahora el siguiente paso es importante asi que presta atencion. Jjaja na es broma cheeky

Si vas a implementar el paquete en una version de laravel menor a la 5.6 debes hacer esto

dirigirse al archivo  archivo config/app.php incluir el siguiente service provider



'providers' => [
    FuriosoJack\LaraException\Providers\LaraExceptionServiceProvider::class,
];

y luegos las alianzas o fachadas

'aliases' => [
    'LaraException' => FuriosoJack\LaraException\Facades\LaraExceptionFacade::class,
  ],



Ahora es necesario cambiar la clase de la que extiende la clase App/Exceptions/Handler.php por LaraExceptionManager

entonces importamos en el archivo Handler lo siguiente

use FuriosoJack\LaraException\Exceptions\LaraExceptionManager;



y cambianos la clase ExceptionHandler por LaraExceptionManager y el archivo handler debe quedar asi 



namespace App\Exceptions;
    
    use Exception;
    use Illuminate\Auth\AuthenticationException;
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    use FuriosoJack\LaraException\Exceptions\LaraExceptionManager;
    class Handler extends LaraExceptionManager
    {



y para finalizar en su consola debe publicar la configuracion del paquete para ello tan solo ejecutando el comando

php artisan vendor:publish --tag=config.lara_exception



Ya para un funcionamiento mas a detalle dejo por AQUI el manual.



Al grano!!!

Para solucionar el error del ejemplo se tendria que añadir dentro del if un lara exception quedando masomenos asi

if(is_null($post)){
   lara_exception("El post no existe")->build(404);
}
//Ejecución del flujo normal (crear el comentario)

En el caso de que entre al if se pdrouciria una excepcion que seria capturada por el Manejador de excepciones del paquete el cual generaria un redirect ya que no se le indico lo contrario hacia la pagina por defecto de un error de lara exception que se veria con estilo visual como este.





vista que puede ser perfectamente personalizable es decir la anterior imagen apenas es una platilla que usted puede modificar y ademas de eso puede tener mulpiples plantillas para que genere excepciones con diferentes estilos visuales, pero eso sera en otro post.


0 Comentarios