Depuración y manejo de errores con Laravel

Ignition incluye una serie de soluciones a problemas comunes por defecto. Sin embargo, también es posible crear soluciones nuevas y personalizadas y esto es lo que aprenderás en este video-tutorial.

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Hay dos formas de proveer soluciones a un problema a través de una simple descripción básica o una solución auto-ejecutable.

Ejemplo de excepción con solución simple

Si estás arrojando una excepción personalizada puedes hacer que tu clase de excepción implemente la interfaz común Facade\IgnitionContracts\ProvidesSolution y retorne a través del método requerido getSolutions una posible solución al problema:

<?php // app/Exceptions/MyCustomException.php

namespace App\Exceptions;

use Exception;
use Facade\IgnitionContracts\Solution;
use Facade\IgnitionContracts\BaseSolution;
use Facade\IgnitionContracts\ProvidesSolution;

class MyCustomException extends Exception implements ProvidesSolution
{

    public function getSolution(): Solution
    {
        return BaseSolution::create('This is not a useful solution')
            ->setSolutionDescription('This is not a useful description.')
            ->setDocumentationLinks(['Styde' => 'https://styde.net']);
    }
}

Podemos ver nuestra solución cuando se lance la excepción:

<?php // routes/web.php

use App\Exceptions\MyCustomException;

Route::get('/', function () {
    throw new MyCustomException;
});

Ejemplo de solución auto-ejecutable

Una solución auto-ejecutable no es más que una clase que implementa la interfaz RunnableSolution. Esta interfaz nos provee de una «Plantilla» (la idea es similar a cómo funciona el Patrón Template Method) y solo tenemos que escribir el código de los diferentes métodos. La mayoría de ellos solo retornan cadenas e información:

<?php

namespace App\Solutions;

use Illuminate\Support\Facades\File;
use Facade\IgnitionContracts\RunnableSolution;

class MyRunnableSolution implements RunnableSolution
{
    public function getSolutionActionDescription(): string
    {
        return 'Catch or remove the exception.';
    }

    public function getRunButtonText(): string
    {
        return 'Remove exception';
    }

    //...

    public function getSolutionTitle(): string
    {
        return 'Your application threw a custom exception';
    }

    public function getSolutionDescription(): string
    {
        return 'A `MyCustomException` exception was thrown and not caught.';
    }

    public function getDocumentationLinks(): array
    {
        return [
            'Learn more in Styde' => 'https://styde.net',
        ];
    }
}

La «acción» como tal se produce en el método run que es el método que será llamado para ejecutar la solución. Por otro lado, el método getRunParameters nos permite pasar información desde la petición original que falló (en nuestro caso donde lanzamosMyCustomException) a la petición nueva donde se ejecutará la solución (que podemos observar en la pestaña Network de Ignition).

<?php

namespace App\Solutions;

use Illuminate\Support\Facades\File;
use Facade\IgnitionContracts\RunnableSolution;

class MyRunnableSolution implements RunnableSolution
{
    /**
     * @var string|null
     */
    private $file;

    public function __construct(string $file = null)
    {
        $this->file = $file;
    }

    public function run(array $parameters = [])
    {
        $content = File::get($parameters['file']);

        File::replace($parameters['file'], $this->removeCustomException($content));
    }

    protected function removeCustomException(string $content): string
    {
        return str_replace('throw new MyCustomException', '// throw new MyCustomException', $content);
    }

    public function getRunParameters(): array
    {
        return [
            'file' => $this->file,
        ];
    }
}

En este código como solución solo estoy comentando la línea donde he lanzado la excepción, para ello obtengo el archivo y reemplazo su contenido usando los métodos del Facade File.

Es posible que encuentres algún problema si el sistema de archivos no puede reemplazar el contenido de web.php. Agrega los permisos necesarios para ello. Ten en cuenta que esto es solo un sencillo ejemplo ilustrativo.

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

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

Lección anterior Editar y ejecutar código de Laravel desde el navegador con las extensiones de Ignition Lección siguiente Crear proveedores de solución personalizados con Ignition y Laravel