La nueva versión de Laravel 5.5 oficialmente ha salido a la luz, este lanzamiento se encuentra cargado de muchas mejoras y nuevas funcionalidades. Esta es la nueva versión LTS, por la cual tendrá soporte extendido para la corrección de errores durante dos años, y arreglos de seguridad durante tres.
En Laravel News nos han dejado un vídeo resumen de las nuevas características.
Taylor Otwell describió recientemente sus pensamientos sobre Laravel 5.5 en este tweet:
Leave tomorrow for @LaraconEU. 5.5 next week also. Favorite release yet. Love the shape the framework is in. Never been happier with it. 😍
— Taylor Otwell (@taylorotwell) August 25, 2017
Laravel 5.5 es un Release LTS
Laravel 5.5 es la nueva versión de soporte a largo plazo (LTS) de Laravel (siendo el último 5.1). Las versiones LTS reciben correcciones de errores durante dos años y arreglos de seguridad durante tres años.
Paquete Whoops
Para los que pudieron utilizar Laravel en su version 4 podran recordar que whoops proporcionaba una manera elegante para el momento frustrante dentro de la depuración los errores. El paquete whoops vuelve a Laravel 5.5.
Ya habíamos hablado de esto anteriormente.
Dumping de Colecciones.
Otra gran característica para la depuración (que se ha visto anteriormente como un paquete o un macro) es un método para el dumping de una colección:
1 2 3 4 5 6 7 8 9 10 | <?php Song::all() ->filter ->platinum ->dump() ->filter(function ($song) { return $song->released_on >= \Carbon\Carbon::parse('-10 years'); }) ->dd(); |
Recordemos que el helper dd() nos permite imprimir una salida y mata la aplicación.
Representación de excepciones
A partir de ahora las excepciones pueden renderizar una respuesta si definen un método público “response”. Normalmente, en las versiones anteriores de Laravel se podia agregar una comprobación en método App\Exceptions\Handler::render()
y enviar de forma condicional una respuesta basada en el tipo de excepción.
En 5.5, puede lanzar la excepción y responder sin agregar lógica adicional en el controlador:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // throw new TerribleSongException($song) in a controller... namespace App\Exceptions; use App\Song; class TerribleSongException extends \Exception { /** * @var \App\Song */ protected $song; public function __construct(Song $song) { $this->song = $song; } /** * @param \Illuminate\Http\Request $request */ public function render($request) { return response("The song '{$this->song->title}' by '{$this->song->artist}' is terrible."); } } |
También puede implementar la interfaz Responsable en las clases de excepciones, y Laravel responderá automáticamente.
La Interface Responsable
La interfaz Responsable es otra de las novedades. Una clase que implementa la interfaz puede ser devuelta desde un método controlador. El router ahora comprueba si hay una instancia de Responsable
cuando se prepara la respuesta de Illuminate\Routing\Router
.
A continuación se muestra un ejemplo, dejando los detalles de la respuesta en el objeto NewSongResponse
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public function store(Request $request) { $data = request()->validate([ 'title' => 'required', 'artist' => 'required', 'description' => 'required', 'duration' => 'required|numeric', 'released_on' => 'required|date_format:Y-m-d', 'gold' => 'boolean', 'platinum' => 'boolean', ]); $song = new Song($data); $song->save(); return new NewSongResponse($song); } |
Esto es lo que podría parecer la clase implementando la interfaz Responsable para crear una nueva canción:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php namespace App\Http\Responses; use App\Song; use Illuminate\Contracts\Support\Responsable; class NewSongResponse implements Responsable { /** * @var \App\Song */ protected $song; /** * @param \App\Song $song */ public function __construct(Song $song) { $this->song = $song; } public function toResponse($request) { if ($request->wantsJson()) { return response() ->json($this->song) ->header('Location', route('songs.show', $this->song)) ->setStatusCode(201); } return redirect() ->route('songs.show', $this->song); } } |
En este sencillo ejemplo, se puede responde automáticamente en JSON si realiza una solicitud a través de AJAX y, por defecto, responde con una redirección a la ruta songs.show
route.
Método Validación de Request
En versiones anteriores de Laravel pasarías la instancia de la petición al metodo $this->validate()
en un controlador.
1 | $this->validate(request(), [...]); |
Ahora, se puede llamar a “validate” el objeto Request:
1 2 3 4 5 6 7 8 9 | $data = request()->validate([ 'title' => 'required', 'artist' => 'required', 'description' => 'required', 'duration' => 'required|numeric', 'released_on' => 'required|date_format:Y-m-d', 'gold' => 'boolean', 'platinum' => 'boolean', ]); |
Otro beneficio agradable de este estilo de validación es que el valor de retorno actúa como Request::only()
, devolviendo solamente las claves proporcionadas en la llamada. Devolver sólo las claves validadas es una convención excelente para usar, evitando Request::all()
.
Nuevos Objetos y Closures para las reglas de validación personalizadas
Mi característica favorita de Laravel 5.5 es la de los nuevos objetos y closures de las reglas para las validaciones personalizadas. La creación de un objeto para regla personalizada es una excelente alternativa a la creación de reglas personalizadas con Validator::extend(que todavía se puede usar), porque queda más claro dónde se localiza la lógica de las reglas. Un objeto de regla de validación podría tener este aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class CowbellValidationRule implements Rule { public function passes($attribute, $value) { return $value > 10; } public function message() { return ':attribute needs more cowbell!'; } } |
Un ejemplo del uso de esta regla de validación podría ser:
1 2 3 4 5 6 7 8 9 10 | <?php request()->validate([ 'cowbells' => [new CowbellValidationRule], 'more_cowbells' => [function ($attribute, $value, $fail) { if ($value <= 10) { $fail(':attribute needs more cowbell!'); } }] ]); |
El Closure toma el atributo, el valor y un parámetro de error al que llama si falla la regla de validación. El Closure es una buena forma de experimentar con una validación personalizada antes de extraerla a un objeto de regla dedicado o para las necesidades de validación única.
Para crear objetos de reglas de validación personalizados, puede utilizar el nuevo mandato make:rule
:
1 | php artisan make:rule MyCustomRule |
Directivas Blade para Auth y Guest
Normalmente, se puede utilizar algo como lo siguiente para comprobar si hay un usuario autenticado en Blade:
1 2 3 4 5 | @if(auth()->check()) {{ -- authenticated --}} @endif @if(auth()->guest()) |
Ahora puede utilizar las siguientes directivas para lograr lo mismo:
1 2 3 4 5 6 7 | @auth Welcome {{ user()->name }}! @endauth @guest Welcome Guest! @endguest |
Presets para Frontend
Cuando está iniciando un nuevo proyecto, se proporciona un scaffolding para Vue.js de forma predeterminada. En Laravel 5.5 ahora puede elegir entre unos cuantos presets y quitar todo el scaffolding de frontend con el comando “preset” de artisan en Laravel 5.5.
Si verifica la documentación, se puede observar ver que permite elegir “ninguno”, “bootstrap”, “vu” o “react”:
1 2 3 4 5 6 7 8 9 10 11 12 | php artisan help preset Usage: preset <type> Arguments: type The preset type (none, bootstrap, vue, react) # Use react $ php artisan preset react # Clear scaffolding $ php artisan preset none |
Archivos de Fabrica Separados
Los archivos de fábrica (o factory mejor conocido), los cuales si no sabes son aquellos que se utilizan para crear datos de pruebas de los modelos, que normalmente se utilizan en los Seeder para generar datos de prueba con ellos, se definieron previamente en un archivo llamado ModelFactory.php. Ahora, se puede crear diferentes archivos para cada modelo. Se puede crear un archivo de fábrica cuando cree un nuevo modelo con:
1 2 3 4 | php artisan make:model -fm Post # o crear un controlador, un modelo, una migracion y un factory con $ php artisan make:model --all |
También puede crear un archivo de fábrica directamente con “make: factory”:
1 | php artisan make:factory --model=Example ExampleFactory |
El Comando migrate:fresh
El nuevo comando de migración “migrate:fresh” 5.5 es una buena manera para crear una base de datos limpia en un entorno de desarrollo. Este elimina todas las tablas de la base de datos y luego corre las migraciones.
Puede que te suene familiar con el comando “migrate:refresh”, pero este lo que hace es realizar un rollback a las migraciones y luego las vuelve a ejecutar. Usualmente este nuevo comando se utiliza en un entorno de desarrollo donde quieras eliminar todas las tablas, obtener una base de datos fresca y correr las migraciones.
El Trait “RefreshDatabase”
En el entorno de los Tests o pruebas, el trait “RefreshDatabase” es la nueva manera de migrar bases de datos durante pruebas. Este nuevo trait toma el mejor enfoque para migrar tu base de datos de prueba dependiendo en si usas una base de datos en-memoria o tradicional. Los traits “DatabaseTransactions” y “DatabaseMigrations” aun están disponibles en el 5.5, permitiéndote actualizar sin tener que utilizar el rasgo “RefreshDatabase”.
El método “WithoutExceptionHandling()”
Para el caso de pruebas se hereda el método “withoutExceptionHandling()”, el cual te permite desactivar el manejo de excepciones para una prueba. Desactivar esto te permite obtener la excepción en tu prueba y verificarla en vez de obtener la respuesta del manejador de excepciones, Edemas es una herramienta de depuración muy útil para cuando tu entorno de pruebas esta haciendo algo que no te esperas y quieres ver el verdadero error.
Automatic Package Discovery
La ultima característica que veremos sera el descubrimiento automático de paquetes. Mientras que usualmente los paquetes de laravel no son difíciles de instalar, la detección de paquetes significa que no tienes que configurar proveedores o alias. Puedes desactivarla para paquetes específicos.
Más información sobre Laravel 5.5
Para obtener una visión más detallada puedes revisar nuestro contenido de Laravel 5.5 el cual iremos ampliando en el transcurso de los dias. Además, tanto Laracasts (ingles) como Styde (español) tienen una serie completa disponible en todas estas características. También, echa un vistazo a la documentación oficial, notas de lanzamiento y la guía de actualización.
Si logran comparar, no es una traducción exacta sino que hemos adaptado un poco la traducción para agregar algunas cosas extras y/o hacer que se entiendan mejor algunos detalles. Si tienen alguna sugerencia recuerden que pueden hacerlo desde el Slack. Damos la gracias a @kevin que desde Slack me apoyo durante la traducción para sacar el articulo mas rápido.