laravel-novedades-5-2-

Laravel se mantiene en constante desarrollo, prueba de ello son las nuevas mejoras que trae la última versión, la 5.2.23, las cuales veremos a continuación:

Regla de validación in_array

Con esta regla se puede validar que un valor de una clave exista en otra clave relacionada. Por ejemplo para asegurar que todos los user_id de devices existan en el array users se hace:

Validator::make(
    [
        'devices' => [['user_id' => 1], ['user_id' => 2]],
        'users' => [['id' => 1, ['id' => 2]]]
    ],
    ['devices.*.user_id' => 'in_array:users.*.id']
);

Arr::first() y Arr::last() ahora tiene el callback opcional

Hasta Laravel 5.2.22 estos dos métodos exigían dos parámetros:

array = [100, 200, 300];

//Devuelve 200
Arr::first($array, function ($key, $value) {
    return $value >= 150;
});

Pero ahora el callback (segundo parámetro) es opcional por lo que también podemos hacer:

$array = [100, 200, 300];

// Devuelve 100
Arr::first($array); 

// Devuelve 300
Arr::last($array);

Es también válido para los helpers array_first  y array_last

Middleware en los controladores

Ahora es posible registrar mútiples middleware en una misma sentencia:

$this->middleware(['auth', 'subscribed'], ['only' => ['edit', 'update']]);

Nuevas directivas en Blade

@php y @endphp

Con la cual podemos escribir sentencias de PHP:

@php($count = 1)

@php(++ $count)

y para múltiples líneas:

@php
    $now = new DateTime();

    $environment = isset($env) ? $env : "testing";
@endphp

@unset

Para hacer el llamado a la función de PHP unset():

@unset($count)

Sobreescribir directivas de Blade

Antes de esta versión no era posible extender Blade sobreescribiendo sus directivas, ahora sí se puede hacer.

Escapar directivas de Blade

Para evitar que se compilen una directiva de Blade podemos colocar un @ adicional a la directiva de esta manera:

@continue
//resultado:  <?php continue; ?>

@@continue
//resultado: @continue

En caso de querer escapar múltiples sentencias, se puede usar la nueva directiva de Blade @verbatim:

@verbatim
    @if {{ $var }} @endif
@endverbatim

Nuevo mail drive para SparkPost

Nuevo método monthlyOn() para programación de tareas

$schedule->call(function () {
    DB::table('shopping_list')->delete();
})->monthlyOn(4, '12:00');

Nuevo método isLocate()

En vez de realizar esto:

if (app()->getLocale() == 'es')

Ahora se puede hacer:

if (app()->isLocale('en'))

Consultas a los campos JSON de MySQL 5.7 y Postegres con query builder

En la versión 5.7 de MySQL se introdujo una nueva columna tipo JSON, por lo que ahora en Laravel 5.2.23 se puede hacer consultas a atributos de ese tipo:

Supongamos que se tiene una tabla users con una columna tipo JSON, que tiene los siguientes valores:

{"en":"name","ar":"nom"}

Podrás consultas sus valores con la siguiente sintaxis:

User::where('name->en', 'name')->get();

incluso se puede usar el operador -> para consultar valores anidados:

User::where('contacts->phone->home', 1234);

Notas:

  • Para Postgres funciona la misma sintaxis, Laravel convertirá el formato column->key->key->... a una ruta de JSON válida antes de ser enviado al driver de base de datos.
  • En MySQL el resultado será un string JSON ("name" en vez de name) por tanto, se necesita usar json_decode() antes de ser mostrado

Nuevos helpers para las pruebas: seeElement() y dontSeeElement()

Teniendo este elemento en una vista:

<image width="100" height="50">

Se pueden usar los helpers de la siguiente manera para que la prueba pase:

$this->seeElement('image', ['width' => 100, 'height' => 50]);

$this->dontSeeElement('image', ['class' => 'video']);

Otras mejoras

  • Sabes que se puede hacer esto:
    User::whereNameAndEmail('jon', '[email protected]')->first();
    
    User::whereNameAndEmailOrPhone('jon', '[email protected]', '123321')->first();
    
    DB::table('users')->whereEmailOrUsername('[email protected]', 'themsaid')->first();
  • En vez de hacer esto:
    if(!$item){
        abort(404);
    }

    Puedes hacer esto:

    abort_unless($item);
    

    o también puedes tener algo como esto:

    abort_if($item->is_hidden);

Nota

Esta publicación es una traducción de What’s new in laravel 5.2.23

Material relacionado

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