Todos los artículos

Chaperone, Defer, Cache::flexible y más ya están disponibles en Laravel 11.23

Julian Beaujardin
Julian Beaujardin Reference: Laravel News September 12th, 2024

El equipo de Laravel lanzó la versión 11.23 esta semana, con las actualizaciones de código abierto presentadas en Laracon US 2024, como defer(), concurrencia, atributos contextuales del contenedor, y más.

Actualizaciones de Laracon 2024

Taylor Otwell contribuyó con todas las novedades que compartió en su discurso principal en Laracon US 2024, incluyendo chaperone(), defer(), Cache::flexible(), atributos contextuales de contenedores, y más.

La documentación está siendo actualizada; aquí tienes algunos puntos destacados que debes revisar para familiarizarte con estas actualizaciones:

Consulta el Pull Request #52710 para ver todos los detalles relacionados con las adiciones de Taylor.

Agregar Reglas minRatio y maxRatio a la Validación de Dimensiones

Cam Kemshal-Bell añadió las proporciones mínimas y máximas a la regla de validación de dimensiones:

Puedes usar estos métodos de forma fluida, utilizando minRatio(), maxRatio(), y ratioBetween():

use Illuminate\Validation\Rule;

//
// Usando los métodos fluidos minRatio y maxRatio
//
Rule::dimensions()
    ->minRatio(1 / 2)
    ->maxRatio(1 / 3;
// dimensiones:min_ratio=0.5,max_ratio=0.33333333333333

//
// Equivalente usando ratioBetween()
//
Rule::dimensions()->ratioBetween(min: 1 / 2, max: 1 / 3);

// dimensiones:min_ratio=0.5,max_ratio=0.33333333333333

También puedes usar la regla de estilo de cadena de dimensiones con esta actualización:

use Illuminate\Support\Facades\Validator;

Validator::make($request->all(), [
    'min_12' => 'dimensions:min_ratio=1/2',
    'square' => 'dimensions:ratio=1',
    'max_25' => 'dimensions:max_ratio=2/5',
    'min_max' => 'dimensions:min_ratio=1/4,max_ratio=2/5',
]);

Soporte para Enum Respaldo en Métodos Gate y Middleware de Autorización

Diaa Fares contribuyó con dos pull requests que continúan agregando soporte para enums respaldados. Esta versión incluye actualizaciones para los métodos Gate y el middleware Authorize.

Aquí hay algunos ejemplos de cómo usar Enums con métodos Gate:

enum Abilities: string {
    case VIEW_DASHBOARD = 'view-dashboard';
    case EDIT = 'edit';
    case UPDATE = 'update';
}


// Antes
Gate::define('view-dashboard', function (User $user) {
    return $user->isAdmin;
});

Gate::authorize('view-dashboard');
Gate::inspect('view-dashboard');
Gate::check('view-dashboard');
Gate::any(['edit', 'update'], $post);
Gate::none(['edit', 'update'], $post);
Gate::allows('update', $post);
Gate::denies('update', $post);

// Después
Gate::define(Abilities::VIEW_DASHBOARD, function (User $user) {
    return $user->isAdmin;
});

Gate::authorize(Abilities::VIEW_DASHBOARD);
Gate::inspect(Abilities::VIEW_DASHBOARD);
Gate::check(Abilities::VIEW_DASHBOARD);
Gate::any([Abilities::EDIT, Abilities::UPDATE], $post);
Gate::none([Abilities::EDIT, Abilities::UPDATE], $post);
Gate::allows(Abilities::UPDATE, $post);
Gate::denies(Abilities::UPDATE, $post);

Aquí hay un ejemplo del soporte para enums respaldados en el middleware Authorize:

Route::get('/dashboard', [AdminDashboardController::class, 'index'])
   ->middleware(
       Authorize::using(Abilities::VIEW_DASHBOARD)
   )
   ->name(AdminRoutes::DASHBOARD);

Omitir Middleware para Trabajos en Cola

Kennedy Tedesco contribuyó con un middleware de omisión para saltarse un trabajo basado en una condición. Este middleware tiene tres métodos de constructor estático que puedes usar, incluyendo when() y unless(). El trabajo se omite según el resultado de la condición utilizada:

class MyJob implements ShouldQueue
{
    use Queueable;

    public function handle(): void
    {
        // TODO
    }

    public function middleware(): array
    {
        return [
            Skip::when($someCondition), // Omitir cuando `true`

            Skip::unless($someCondition), // Omitir cuando `false`

            Skip::when(function(): bool {
                if ($someCondition) {
                    return true;
                }
                return false;
            }),
        ];
    }
}

Método findOrFail() para Colecciones Eloquent

Steve Bauman contribuyó con un método findOrFail() en las colecciones Eloquent que añade una forma de encontrar un modelo en una colección ya poblada:

$users = User::get(); // [User(id: 1), User(id: 2)]

$users->findOrFail(1); // Usuario

$user->findOrFail([]); // []

$user->findOrFail([1, 2]); // [Usuario, Usuario]

$user->findOrFail(3); // ModelNotFoundException: 'No hay resultados de consulta para el modelo [User] 3'

$user->findOrFail([1, 2, 3]); // ModelNotFoundException: 'No hay resultados de consulta para el modelo [User] 3'

Notas de la Versión

Puedes ver la lista completa de nuevas características y actualizaciones a continuación y la diferencia entre 11.22.0 y 11.23.0 en GitHub. Las siguientes notas de la versión son directamente del cambio: