Por cierto, esta nueva versión ya sigue el versionado semántico y Laravel cumple con la promesa de lanzar una nueva mayor release cada 6 meses.

Laravel Airlock

Laravel Airlock es una forma sencilla para autenticar a nuestros usuarios ya sea una single page app, un aplicación móvil o una API sencilla.

De una forma sencilla podemos generar varios tokens para un mismo usuario (si lo necesitamos) y asignar a cada uno de estos tokens unos permisos específicos para comprobar, a la hora de hacer cualquier acción, si el token lo permite o no.

// Generar token
$user->createToken('nombre', ['api:usage'])->plainTextToken;

// Comprobar premisos
if ($user->tokenCan('api:usage')) {
    //
}

También podemos comprobar los permisos del token usando un middleware:

Route::middleware('api:usage')

Más información, sobre Airlock, en la documentación oficial.

Custom Eloquent mutators

Hasta ahora teníamos usos cuantos mutators (transformadores) que podíamos definir en el array $cast de nuestra entidad definiendo los siguientes tipos: integer, real, float, double, decimal:<digits>, string, boolean, object, array, collection, date, datetime y  timestamp.

Ahora, gracias a los custom mutators, podemos definir nuestro propios transformadores y hacer cuanto queramos. Básicamente deberemos crear una clase que implemente la interfaz CastAttributes que simplemente tiene un método get para cuando leemos de la base de datos y un método set para cuando escribimos en ella.

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

Luego podemos implementarlo en cualquier modelo de la siguiente forma:

protected $casts = [
    'options' => Json::class,
];

Blade components tags

Los componentes han sido modificados teniendo ahora una representación en una clase que nos permite especificar los parámetros de entrada y métodos entre otras cosas.

Podemos crear un componente con artisan usando el comando make:component al que le pasaremos, únicamente, el nombre que queramos otorgarte. Esto nos generará una vista en resources/views/components  además de una clase específica en App\View\Components.

Una vez creado, podremos embeber este componente en cualquier vista usando una etiqueta blade que empieza por x- y le sigue el nombre del componente en kebap case. Si nuestro componente se llama UserProfile, por ejemplo, haríamos lo siguiente:

<x-user-profile/>

Entre las opciones que tenemos a la hora de llamar el componente tenemos las de pasarle parámetros, contenido e incluso usar métodos de la clase. Tenéis toda la información en la documentación oficial.

HTTP Client

La última versión de Laravel incorpora un nuevo cliente HTTP que nos permite hacer llamadas HTTP y comunicarnos con otras API de una forma sencilla y legible.

Está basado en Guzzle y hacer una llamada post es tan sencillo como esto:

use Illuminate\Support\Facades\Http;

$response = Http::post('http://victorfalcon.es/api/user', [
    'name' => 'Víctor',
]);

return $response['id'];

Incluso podemos falsear el resultado de las llamadas e incluso testarlas como hacemos con otras facades de Laravel.

Http::fake([
    'victorfalcon.es/api/user' => Http::response(['id' => 1], 200, []),
    'victorfalcon.es/api/*' => Http::response(['id' => 1], 404, ['Headers']),
]);

Http::assertSent(function ($request) {
    return $request->url() == 'victorfalcon.es/api/user' &&
           $request['name'] == 'Víctor';
});

Más información sobre el nuevo HTTP Client en la documentación oficial.

Mejoras en la inyección de modelos en las rutas

Antes, cada vez que inyectábamos un modelo en una ruta, este se buscaba por la id o tenías que crear un model binding específico para cambiarlo. Ahora puedes simplemente hacer {post:slug} para que Laravel, automáticamente, busque el modelo por el campo slug.

Y, lo mejor de todo, es que ahora, si ponemos dos modelos en una misma route, se comprueba, de forma automática, que el primero es padre del segundo.

Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

En el ejemplo anterior, laravel dará por hecho que el usuario tiene una relación posts y comprobará que este sea hijo del anterior devolviendo un not found en caso contrario.

Además de esto hay otras mejoras como múltiples drivers para mandar emails, mejoras en el cacheado de las rutas llegando a doblar la velocidad de lectura, CORS integrados por defecto, mejorás con las colas de MySQL 8+, nueva vista de los tests en consola, nuevo diseño para emails en markdown entre otras.


Más sobre Laravel 7

Laravel 7 is now released!
Laravel 7 is now released and includes many new features including Laravel Airlock, better routing speed, custom Eloquent casts, Blade component tags, fluent string operations, a new HTTP client, CORS support, and many more features.