Depuración y manejo de errores con Laravel

En este videotutorial vamos a desacoplar completamente nuestras soluciones de Ignition del resto de nuestra aplicación, para ello vamos a crear un proveedor de solución y a registrarlo directamente con Ignition.

Agregar un Proveedor de Solución

Podemos crear una clase dedicada a «proveer una solución», en vez de colocar la solución directamente en el código de la excepción. Esto es útil si queremos brindar soluciones a más de un tipo de excepción o si simplemente queremos desacoplar un poco más nuestro código.

Para crear un proveedor de solución debemos crear una clase que implemente la interfaz Facade\IgnitionContracts\HasSolutionForThrowable la cual requiere de 2 métodos:

  • El método canSolve determina si este proveedor de solución puede o no arreglar o sugerir una solución al problema.
  • El método getSolutions retorna un arreglo con soluciones potenciales.

Voy a retornar la solución ejecutable que creé previamente.

<?php

namespace App\SolutionProviders;

use App\Solutions\MyRunnableSolution;
use Throwable;
use App\Exceptions\MyCustomException;
use Facade\IgnitionContracts\HasSolutionsForThrowable;

class MyCustomSolutionProvider implements HasSolutionsForThrowable
{
    public function canSolve(Throwable $throwable): bool
    {
        return $throwable instanceof MyCustomException;
    }

    /** \Facade\IgnitionContracts\Solution[] */
    public function getSolutions(Throwable $throwable): array
    {
        return [
            new MyRunnableSolution($throwable->getFile()),
        ];
    }
}

Nota cómo el método getSolutions recibe la excepción ($throwable) y a través de ésta puedo obtener el archivo donde fue arrojada dicha excepción.

Con esto estamos «casi» listos. Pero, no olvides quitar la implementación de la interfaz ProvidesSolution en la excepción MyCustomException, de lo contrario no podremos comprobar que nuestro proveedor de solución realmente funciona.

Si recargamos la página nuestra solución ha desaparecido :( Esto ocurre porque tenemos que registrarla, en el método boot de cualquier ServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    //...

     public function boot()
    {
        $this->app->make(SolutionProviderRepository::class)->registerSolutionProvider(
            MyCustomSolutionProvider::class
        );

        // or:
        // $this->app->make(SolutionProviderRepository::class)->registerSolutionProviders([
       //     MyRunnableSolution::class
       // ]);
    }
}

Puedes usar el método registerSolutionProvider para registrar individualmente cada solución o registerSolutionProviders para registrar un conjunto de soluciones definidas a través de un arreglo.

¡No olvides importar las clases! Recarga la página y deberías ver la solución nuevamente.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Crear soluciones automáticas a problemas en Laravel con Ignition Lección siguiente Helper global ddd en Laravel