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