El pasado 27 de febrero de 2019 laravel lanzo al mercado su nueva versión 5.8, la cual viene cargada de nuevas características muy emocionantes para la comunidad de desarrolladores laravel.

Como siempre, antes de actualizar una versión de Laravel, asegúrese de leer cuidadosamente y entender las guías de actualización para garantizar un proceso de actualización sin problemas.

Veremos la lista de cambios principales en este articulo sobre las novedades de la versión 5.8 de laravel. Y con algo de suerte se llevarán al finalizar una buena impresión del estado del arte en el mundo laravel.

Caching ahora en segundos en lugar de minutos:

Mi bola de cristal indica que muchos desarrolladores van a tener problemas con este cambio tan drástico y poco obvio cuando actualicen su framework. Y es que ahora la función put de Cache recibe el tiempo de vida del cache en segundos y no en minutos, es decir que si usaban esto:

Cache::put('foo', 'bar', 30);

Ahora para que todo siga intacto deben multiplicar ese 30 por 60, y seguir con su vida.

Helpers deprecados

Todas las funciones globales de string y arrays fueron movidas de paquete en laravel 5.8. si usabas funciones como: array_add, array_first, array_last, str_slug, str_random, etc., ahora puedes encontrarlas en el mismo método pero usando los namespaces: Illuminate\Support\Arr e Illuminate\Support\Str.

Soporte de Carbon 2:

Ahora tendremos la opción de usar Carbon 1 o Carbon 2 para las funciones de DateTime en Laravel 5.8. Recuerden siempre consultar la guía de migración de Carbon si tienen la intención de utilizar Carbon 2.

dotenv 3.0:

Laravel 5.8 admitirá el relativamente nuevo dotenv 3.0 para administrar el archivo de entorno .env de sus proyectos.

Las nuevas características clave de dotenv 3.0 son la compatibilidad con cadenas multilínea y espacios en blanco al final de las cadenas en su archivo de entorno.

Esta es una gran actualización para situaciones donde se requieren claves de API multilínea por seguridad.

Nueva longitud de contraseña predeterminada

La longitud de la contraseña requerida al elegir o restablecer una contraseña se cambió a al menos ocho caracteres.

Cambio de nombre de directorio Mailables:

Esta no es una nueva característica, pero es un elemento importante que tienen que tener en cuenta al actualizar un proyecto.

Si tienen mailables en su proyecto y han personalizado los componentes con el comando php artisan vendor:publish, los nombres de las carpetas han cambiado ligeramente:
El directorio /resources/views/vendor/mail/markdown ahora se llama
/resources/views/vendor/mail/text.

Esto se debe a que ambas carpetas pueden contener código markdown para hacer que las plantillas html sean responsivas y se vean atractivas y ademas tengan recursos de texto sin formato para aquellos que no les gusta abrir correos que contienen html. Es más lógico llamar el texto de la carpeta de markdown.

Probando PHPUnit 8

Por defecto, Laravel 5.8 usa PHPUnit 7. Sin embargo, puede actualizar opcionalmente a PHPUnit 8, que requiere PHP> = 7.2. Para este cambio, los métodos setUp y tearDown ahora requieren un tipo de retorno nulo:

protected   function  setUp ( ) :  void
protected  function  tearDown ( ) :  void

Canales de notificación Nexmo y Slack:

Los canales de notificación de Nexmo y Slack se eliminaron del proyecto principal de Laravel y se extrajeron en paquetes de primera mano.

Para continuar usando la funcionalidad Slack o Nexmo en su proyecto, deberá usar:

composer require laravel/nexmo-notification-channel
composer  require  laravel/slack-notification-channel

Luego se pueden configurar y usar como antes.

Nuevas plantillas de página de error.

Laravel 5.8 incluirá nuevas páginas de error con un diseño muy minimalista que pretende ser más adecuado para una variedad de sitios web y aplicaciones web sin necesidad de ser rediseñado para que se ajuste a un tema.

Mejoras al artisan

Si desea llamar al comando de Artisan mediante programación, generalmente usa el método de llamada de Artisan ::. Pero qué pasa si necesita pasar algunas opciones al comando. Aquí hay una manera simple de hacerlo.

Artisan::call('migrate:install', ['database' => 'foo']);

Pero con laravel 5.8, es como un comando que se escribe en la consola / terminal. Súper fácil de definir opciones en línea para mandar.

Artisan::call('migrate:install --database=foo');

Validación de correo electrónico

La regla de validación incorporada de Laravel para correo electrónico en 5.8 ahora permitirá caracteres internacionales en las direcciones de correo electrónico.

Si tiene el siguiente código de validación:

$request->validate([
  'email' => 'email',
]);

E intente validar una dirección de correo electrónico como swe@bär.au en 5.7, fallará. Sin embargo pasará la validación en 5.8.

En 5.7, la lógica de validación no coincidía con la lógica utilizada por SwiftMailer (la biblioteca de correo PHP utilizada por Laravel), pero ahora ambas cumplen con la conformidad RFC6530.

Preservación de llaves de recursos de eloquent

Anteriormente, cuando usamos una colección de eloquent, entonces se restablecerá la clave de la colección y se devolverá el orden simple.

Pero ahora puede establecer la propiedad preserveKeys en su clase de recurso para preservar las claves de su colección.

namespace App\Http\Resources;

useIlluminate\Http\Resources\Json\JsonResource;

class User extends JsonResource {

    /**
    * Indicates if the resource's collection keys should be preserved.
    *
    * @var bool
    */

    public $preserveKeys = true;

}

 

Método de orden superior orWhere

En versiones anteriores de Laravel, podemos combinar los ámbitos del modelo utilizando o el operador de consulta que requiere una devolución de un closure.

$posts  =  App\Post::popular()->orWhere( function ( Builder  $query )  {
    $query -> active ( ) ;
})->get();

Laravel 5.8 introduce un método de “orden superior” o de Where donde le permite encadenar estos ámbitos con fluidez sin el uso de Closures:

$posts  =  App\Post::popular()->orWhere->active()->get();

Valores JSON en MySQL

Si está almacenando valores JSON en las columnas de la base de datos MySQL y MariaDB, en 5.7 Laravel devolvería los valores envueltos entre comillas dobles. 5.8 devuelve los mismos valores en cadenas más limpias.

El siguiente es el ejemplo de la guía de actualización de Laravel que ilustra el cambio:

$value = DB::table('users')->value('options->language');
dump ( $value ) ;

//  Laravel  5.7 …

'"en"'

 //  Laravel  5.8 …
'en'

Pluralización correcta

Una corrección para la pluralización de sus modelos se corrige en el nivel 5.8

en Laravel 5.7,
app\Advice.php será pluralizada opcionalmente pero app\Customer_advice se pluralizará como customer_advices, lo cual es incorrecto.

En laravel 5.8
app\Advice.php seguirá pluralizado solo como consejo, pero app\Customer_advice se pluralizará como customer_advice, lo cual es correcto.

Métodos de prueba de mock/advice

Hacer mocks (simulacros) de cualquier clase en laravel ahora es aún más simple.

//  Laravel 5.7

$this->instance(Stripe::class, Mockery::mock(Stripe::class, function($mock) {
    $mock->shouldReceive('charge')->once() ;
}));

//  Laravel 5.8

$this->mock(Stripe::class, function($mock) {
    $mock->shouldReceive('charge')->once();
});

Ruta de archivo de plantillas Blade agregada en archivo compilado

Como sabemos, laravel compila el archivo blade, pero como desde laravel 5.7 o laravel 5.6 en los archivos blade compilados, no hay ninguna ruta de archivo de la compilación que pueda servir de referencia para saber lo que estamos viendo.

En laravel 5.8, proporcionan la ruta de la ruta del archivo de plantilla blade en un comentario al inicio del archivo.

Mejoras al comando artisan serve

Actualmente, cuando ejecutamos el comando php artisan serve, el servidor Laravel inicia la aplicación en el puerto 8000. Si se ejecuta otro comando serve y se escucha en este puerto, fallará el intento de servir la aplicación. En Laravel 5.8, el comando de servicio php artisan ahora busca el puerto disponible hasta el puerto 8009, lo que le permitirá servir múltiples aplicaciones.

Auto descubrimiento de políticas de los modelos

Ahora, con laravel 5.8, no se tiene que registrar los Policies hasta que estén en su directorio convencional, que es App/Policies.
Además, el nombre de la política debe coincidir con el nombre del modelo y tener un sufijo de política. Por lo tanto, un modelo de “Product” correspondería a una clase “ProductPolicy.”

Relaciones HasOneThrough

En Laravel 5.8, tendremos una nueva relación llamada HasOneThrough. Por ejemplo, si tenemos un modelo de comentario que tiene un usuario y un modelo de usuario tiene un modelo de perfil. Podemos usar la relación HasOneThrough para obtener el perfil para un comentario determinado. Como abajo,

public function profile() {
    return $this->hasOneThrough(Profile::class, User::class);
}

Token Guard Token Hashing

Ahora, con laravel 5.8, podemos configurar fácilmente un sistema de tokens para APIs en el mismo laravel que puede almacenar un token con un hash SHA-256.


Esto significa que no tiene que usar específicamente el pasaporte de laravel solo para la autenticación o cualquier paquete jwt. Pero si desea utilizar cualquier paquete, es totalmente gratuito ya que el paquete de pasaporte está allí para el usuario.

Programador predeterminado de zona horaria

Cuando definimos una tarea programada podemos usar el método de zona horaria como se muestra a continuación,

$schedule->command('inspire')
  ->hourly()
  ->timezone('Europe/London');

¿Qué sucede si tiene una serie de tareas y tiene que establecer la zona horaria en cada una de ellas?

En Laravel 5.8, puede definir un nuevo método llamado scheduleTimezone en app/console/kernel.php. Este método debe devolver la zona horaria predeterminada que debe asignarse a todas las tareas.

protected function scheduleTimezone() {
  return 'Europe/London';
}

Guardias de autenticación de transmisión múltiple

Ahora podemos autenticar los canales privados o de presencia con diferentes middlewares, que no sean el middleware predeterminado del proyecto.

Broadcast::channel('nombre del canal', function() {
    //...
}, ['guards' => ['web', 'admin']])

Categorized in:

Tagged in:

, , ,