En esta charla de Laracon Online 2018, Taylor Otwell nos habla sobre el lanzamiento de Laravel 5.6 y los nuevos features que incluye esta versión. Ésta es una versión de mantenimiento no muy diferente a Laravel 5.5, sin embargo, como cada versión nueva de Laravel, incluye características muy interesantes, vamos a verlas:

Mejoras al Logging en Laravel

La personalización del logging de Laravel, ahora es mucho más potente y más parecida a otras partes del framework. Laravel 5.6 incluye un archivo llamado logging.php en la carpeta de configuración, donde puedes agregar «canales» de logging (channels), por ejemplo:

<?php

return [
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single'],
        ],

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],

        //....

        'slack' => [
            'driver' => 'slack',
            'url' => env('LOG_SLACK_WEBHOOK_URL'),
            'username' => 'Laravel Log',
            'emoji' => ':boom:',
            'level' => 'critical',
        ],
];

En tu aplicación puedes usar el log de la siguiente manera:

<?php

// Uso del canal por defecto:
Log::info('Debug information...', ['user_id' => 1]);

// Enviar info al log para los canales single y daily:
Log::stack(['single', 'daily'])->info('Something happened!');

// Enviar info al log de canales personalizados:
Log::channel('custom')->info('Something else');
Log::channel('slack')->critical('The system is down!!!');

Ejecutar comandos en un solo servidor

<?php

$schedule->command('sleep')
    ->onOneServer();

Esta nueva opción nos permite que una aplicación que está ejecutándose en múltiples servidores limite la ejecución de comandos que cumplen la misma tarea al mismo tiempo a un solo servidor.

Limitar número de peticiones procesadas

Laravel nos permite limitar la cantidad de veces que queremos permitirle a un usuario acceder a una ruta utilizando el middleware throttle, como puedes ver a continuación:

<?php

Route::get('/throttle', function () {
    return 'Access granted!';
})->middleware('throttle:2,1');

El primer argumento del middleware se refiere a la cantidad de intentos máximos para acceder a la ruta y el segundo argumento es la cantidad de minutos. Es decir, en este ejemplo, un usuario podría acceder a la url '/throttle' 2 veces por minuto.

Laravel 5.6 nos permite definir un límite personalizado, en el ejemplo debajo pasamos el argumento rate_limit:

<?php

Route::get('/user-throttle', function () {
    return 'Access Granted!';
})->middleware('throttle:rate_limit,1');

Si el usuario está conectado, Laravel va a obtener la información de la propiedad rate_limit del modelo de dicho usuario. Es decir, va a llamar a auth()->user()->rate_limit y a usar el valor retornado por esta propiedad como el número máximo de intentos permitidos.

Descarga de archivos con Storage::download

El nuevo método download de la clase Storage nos permite ofrecer descarga de archivos de manera muy sencilla:

<?php

// Uso simple:
Storage::download('nombre-de-archivo.txt'):

// Darle un nombre personalizado al archivo:
Storage::download('nombre-de-archivo.txt', 'nombre-personalizado.txt'):

Uso de Broadcasting con clases de tipo «Channel»

En Laravel 5.6 es posible definir clases para autorizar canales, lo cual es útil en situaciones donde tenemos muchas reglas y funciones anónimas en el archivo routes/channels.php:

<?php

use App\Broadcasting\OrderChannel;

Broadcast::channel('order.{order}', OrderChannel::class);

Con php artisan make:channel es posible crear una nueva clase Channel:

<?php

namespace App\Broadcasting;

use App\User;

class MyChannel
{
    //...

    /**
     * Authenticate the user's access to the channel.
     *
     * @param  \App\User  $user
     * @return array|bool
     */
    public function join(User $user)
    {
        //
    }
}

Generación de controladores de recursos para APIs

Laravel 5.6 trae una nueva opción para generar controladores de tipo recurso para API, se trata por supuesto de la opción --api que fue agregada al componente make:controller:

php artisan make:controller TestApiController --api

Esta opción generará un controlador de tipo recurso sin los métodos create ni edit que se usan típicamente para mostrar formularios HTML y por supuesto no tienen mucha utilidad cuando estamos desarrollando una API.

Personalización de formatos de fechas y horas en Eloquent

Eloquent ya incluía la opción de $casts para poder transformar un atributo de un tipo a otro, por ejemplo un TINYINT a boleano, como ya hemos aprendido en los Cursos en Styde.

Ahora Laravel 5.6 nos permite personalizar el formato de los atributos que convirtamos a fechas:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $casts = [
        'last_seen_at' => 'datetime:d-m-Y'
    ];
}

En este ejemplo la columna last_seen_at (suponiendo que exista) será convertida a una fecha con el formato d-m-Y.

Argon hashing

Una alternativa a bcrypt para generar hashes es utilizar el driver argon en Laravel 5.6, el cual acepta más opciones de configuración que bcrypt:

<?php
// Uso del driver argon:
Hash::driver('argon')->make('secret');

// Uso del driver argon con opciones personalizadas:
Hash::driver('argon')->make('secret', [
  'threads' => 4,
  'memory' => 2048,
  'time' => 2000,
]);

El segundo llamado con más opciones incrementará el tiempo en el que se genera el hash.

Collision: Nueva dependencia de desarrollo

El paquete Collision, utilizado solo en el ambiente de desarrollo, permite que al momento de recibir una excepción en la terminal esta sea mucho más agradable a la vista, permitiéndonos comprender mejor el error:

Collision en Laravel 5.6

Cambios a la generación de módulos de autenticación

Las plantillas de autenticación y registro que son copiadas a tu aplicación a través del uso del comando php artisan make:auth, han sido actualizadas para usar Bootstrap 4 que ya está disponible en su versión oficial.

Además el paginador ya usa los estilos de Bootstrap 4 por defecto, pero puedes usar los de Bootstrap 3 si agregas el siguiente código a tu AppServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Paginator::useBootstrapThree();
    }

    //...
}

Nueva versión de Laravel Spark

Taylor también nos contó que la versión de Spark 6.0 estará disponible la semana próxima, es una actualización gratuita para quienes hayan comprado Spark recientemente y habrá un descuento de 50% para quienes ya hayan comprado Spark antes.

Material relacionado

Suscríbete a nuestro boletín

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

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