# Cambios de alto impacto

# Cambios de impacto medio

# Actualizacion a 8.0 de 7.x

Tiempo estimado de actualización: 15 minutos

Intentamos documentar cada posible cambio de ruptura. Dado que algunos de estos cambios de ruptura se encuentran en partes oscuras del marco, sólo una parte de estos cambios pueden afectar realmente a su aplicación.

Se requiere PHP 7.3.0

Probabilidad de impacto: Medio

La nueva versión mínima de PHP es ahora 7.3.0.

Actualizando las dependencias

Actualice las siguientes dependencias en su archivo composer.json:

  • guzzlehttp/guzzle^7.0.1
  • facade/ignition a^2.3.6
  • laravel/framework^8.0
  • laravel/ui^3.0
  • nunomaduro/collision^5.0
  • phpunit/phpunit^9.0

Los siguientes paquetes de primera mano tienen nuevos lanzamientos importantes para apoyar a Laravel 8. Si es aplicable, deberías leer sus guías de actualización individuales antes de actualizar:

Además, el instalador de Laravel ha sido actualizado para soportar composer create-project y Laravel Jetstream. Cualquier instalador anterior a la 4.0 dejará de funcionar después de octubre de 2020. Debería actualizar su instalador global a ^4.0 tan pronto como sea posible.

Finalmente, examine cualquier otro paquete de terceros consumido por su aplicación y verifique que está usando la versión adecuada para el soporte de Laravel 8.

Collecciones

El método isset

Probabilidad de impacto: Baja

Para ser consistente con el comportamiento típico de PHP, el método offsetExists de Illuminate\Support\Collection ha sido actualizado para usar isset en lugar de array_key_exists. Esto puede presentar un cambio en el comportamiento cuando se trata de elementos de la colección que tienen un valor de null:

$collection = collect([null]);

// Laravel 7.x - true
isset($collection[0]);

// Laravel 8.x - false
isset($collection[0]);

Base de datos

Espacio de nombre de Seeder & Factory

Likelihood Of Impact: High

Los sembradores y las fábricas tienen ahora nombres. Para adaptarse a estos cambios, añade el espacio de nombres Database\Seeders a tus clases de sembradoras. Además, el directorio anterior database/seeds debe ser renombrado a database/seeders:

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        ...
    }
}

Si elige usar el paquete laravel/legacy-factories, no se requiere ningún cambio en sus clases de fábrica. Sin embargo, si están actualizando sus fábricas, deberían añadir el espacio de nombres Database\Factories a esas clases.

A continuación, en tu archivo composer.json felimina el bloque classmap de la sección autoload y añade los nuevos mapeos de directorio de clase con nombre:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
},

Eloquent

Model Factories

Probabilidad de impacto: Alta

La característica de Laravel model factories f ha sido totalmente reescrita para apoyar las clases y no es compatible con las fábricas de estilo Laravel 7.x. Sin embargo, para facilitar el proceso de actualización, se ha creado un nuevo laravel/legacy-factories para continuar usando sus fábricas existentes con Laravel 8.x. Puede instalar este paquete a través de Composer:

composer require laravel/legacy-factories

La interfaz Castable

Probabilidad de impacto: Baja

El método castUsing de la interfaz Castable ha sido actualizado para aceptar una serie de argumentos. Si estás implementando esta interfaz deberías actualizar tu implementación en consecuencia:

public static function castUsing(array $arguments);

Eventos de incremento/decremento

Probabilidad de impacto: Baja

Los eventos de modelo relacionados con la "actualización" y la "salvaguarda" se despacharán ahora cuando se ejecuten los métodos de increment or decrement en las instancias de modelo Eloquent.

Eventos

El Dispatcher Contract

Probabilidad de impacto: Baja

El método listen del contract Illuminate\Contracts\Events\Dispatcher contract ha sido actualizado para que la propiedad $listener sea opcional. Este cambio se hizo para apoyar la detección automática de los tipos de eventos manejados a través de la reflexión. Si estás implementando manualmente esta interfaz, deberías actualizar tu implementación en consecuencia:

public function listen($events, $listener = null);

Framework

Actualizaciones del modo de mantenimiento

Probabilidad de impacto: Opcional

La característica maintenance mode de Laravel ha sido mejorada en Laravel 8.x. Ahora se admite la renderización previa de la plantilla del modo de mantenimiento y se eliminan las posibilidades de que los usuarios finales encuentren errores durante el modo de mantenimiento. Sin embargo, para que esto sea posible, se deben añadir las siguientes líneas a su archivo public/index.php. Estas líneas deben colocarse directamente bajo la definición de la constante existente LARAVEL_START:

define('LARAVEL_START', microtime(true));

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
    require __DIR__.'/../storage/framework/maintenance.php';
}

La opción php artisan down --message

Probabilidad de impacto: Medio

La opción --message del comando php artisan down se ha eliminado. Como alternativa, considere pre-rendering your maintenance mode views con el mensaje de su elección..

La propiedad Manager $app 

Probabilidad de impacto: Baja

La propiedad previamente desaprobada $app de la clase Illuminate\Support\Manager ha sido eliminada. Si usted dependía de esta propiedad, debería usar la propiedad $container en su lugar.

El Helper elixir

Probabilidad de impacto: Baja

El Helper elixir previamente desaprobado ha sido retirado. Las aplicaciones que todavía utilizan este método se animan a actualizar a Laravel Mix.

Mail

El método sendNow

Probabilidad de impacto: Baja

El método anteriormente desaprobado sendNow ha sido eliminado. En su lugar, por favor use el método send.

Paginación

Valores por defecto de la paginación

Probabilidad de impacto: Alta

El paginador ahora usa Tailwind CSS framework para su estilo por defecto. Para seguir utilizando Bootstrap, debería añadir la siguiente llamada al método boot de su aplicación AppServiceProvider:

use Illuminate\Pagination\Paginator;

Paginator::useBootstrap();

Queue

El método retryAfter

Probabilidad de impacto: Alta

Por coherencia con otras características de Laravel, el método retryAfter y la propiedad retryAfter de los trabajos en cola, los correos, las notificaciones y los oyentes ha sido renombrado a backoff. Debería actualizar el nombre de este método / propiedad en las clases relevantes de su aplicación.

La propiedad timeoutAt

Probabilidad de impacto: Alta

La propiedad timeoutAt de los trabajos en cola, las notificaciones y los oyentes ha sido renombrada a retryUntil. Deberías actualizar el nombre de esta propiedad en las clases relevantes de tu aplicación.

Los metodos allOnQueue() / allOnConnection()

Probabilidad de impacto: Alta

Para ser consistentes con otros métodos de envío, los métodos allOnQueue() y allOnConnection() tilizados con el encadenamiento de trabajos han sido eliminados. Puede utilizar los métodos onQueue()onConnection() en su lugar. Estos métodos deben ser llamados antes de llamar al método dispatch:

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->onConnection('redis')->onQueue('podcasts')->dispatch();

Tenga en cuenta que este cambio sólo afecta al código que utiliza el método withChain. Los métodos allOnQueue() y allOnConnection() siguen estando disponibles cuando se utiliza el helper global dispatch().

Soporte de lotes de la tabla de empleos fallidosFailed Jobs Table Batch Support

Probabilidad de impacto: Opcional

If you plan to use the job batching features of Laravel 8.x, your failed_jobs de Laravel 8.x, tu tabla de base de datos uuid debería ser añadida a tu tabla:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('failed_jobs', function (Blueprint $table) {
    $table->string('uuid')->after('id')->nullable()->unique();
});

ontinuación, la opción de configuración failed.driver dentro de su archivo de configuración queue debe actualizarse a database-uuids.

Enrutamiento

Prefijación del espacio de nombres del controlador automático

Probabilidad de impacto: Opcional

En versiones anteriores de Laravel, la clase RouteServiceProvider contenía una propiedad $namespace con un valor de App\Http\Controllers. Este valor de esta propiedad se usaba para prefijar automáticamente las declaraciones de ruta del controlador y la generación de la URL de la ruta del controlador, como cuando se llama al ayudante action.

En Laravel 8, esta propiedad está establecida en null por defecto. Esto permite que las declaraciones de ruta del controlador usen la sintaxis llamable estándar de PHP, lo que proporciona un mejor soporte para saltar a la clase de controlador en muchos IDEs:

use App\Http\Controllers\UserController;

// Using PHP callable syntax...
Route::get('/users', [UserController::class, 'index']);

// Using string syntax...
Route::get('/users', 'App\Http\Controllers\UserController@index');

En la mayoría de los casos esto no afectará a las aplicaciones que se están actualizando porque su RouteServiceProvider seguirá conteniendo la propieda $namespace con su valor anterior. Sin embargo, si actualiza su aplicación creando un nuevo proyecto Laravel, puede que lo encuentre como un cambio radical.

Si desea continuar usando el enrutamiento original del controlador auto-prefijado, puede simplemente establecer el valor de la propiedad $namespace dentro de su RouteServiceProvider ay actualizar los registros de ruta dentro del método de arranque para usar la propiedad $namespace:

class RouteServiceProvider extends ServiceProvider
{
    /**
     * The path to the "home" route for your application.
     *
     * This is used by Laravel authentication to redirect users after login.
     *
     * @var string
     */
    public const HOME = '/home';

    /**
     * If specified, this namespace is automatically applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
        });
    }

    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60);
        });
    }
}

Scheduling

La librería cron-expression

Probabilidad de impacto: Baja

La dependencia de Laravel de dragonmantank/cron-expression ha sido actualizada de 2.x to 3.x. Esto no debería causar ningún cambio de última hora en su aplicación a menos que esté interactuando con la biblioteca de cron-expression directamente. Si está interactuando con esta biblioteca directamente, por favor revise su cegistro de cambios.

Sesión

El contract Session

Probabilidad de impacto: Baja

El contract Illuminate\Contracts\Session\Session ha recibido un nuevo método pull. Si está implementando este contract manualmente, debe actualizar su implementación en consecuencia:

/**
 * Get the value of a given key and then forget it.
 *
 * @param  string  $key
 * @param  mixed  $default
 * @return mixed
 */
public function pull($key, $default = null);

Testing

El método decodeResponseJson

Probabilidad de impacto: Baja

El método decodeResponseJson que pertenece a la clase Illuminate\Testing\TestResponse ya no acepta ningún argumento. Por favor, considera usar el método json en su lugar.

El método assertExactJson

Probabilidad de impacto: Medio

El método assertExactJson ahora requiere que las claves numéricas de las matrices comparadas coincidan y estén en el mismo orden. Si desea comparar JSON con una matriz sin necesidad de que las claves numéricas de las matrices comparadas tengan el mismo orden, puede utilizar el método assertSimilarJson en su lugar.

Validación.

Conexiones de reglas de la base de datos

Probabilidad de impacto: Baja

Las reglas únicas y existentes respetarán ahora el nombre de conexión especificado (al que se accede mediante el método getConnectionName del modelo) de los modelos elocuentes al realizar las consultas.

Miscellaneous

También te animamos a ver los cambios en el repositorio de laravel/laravel GitHub. Aunque muchos de estos cambios no son necesarios, puede que desee mantener estos archivos en sincronía con su aplicación. Algunos de estos cambios se tratarán en esta guía de actualización, pero otros, como los cambios en los archivos de configuración o los comentarios, no lo serán. Puede ver fácilmente los cambios con la herramienta de comparación de GitHub y elegir qué actualizaciones son importantes para usted.