• Actualización a 8.0 desde 7.x

Cambios de alto impacto

  • Modelo Factories
  • Cola retryAfter Método
  • Cola timeoutAt Propiedad
  • Cola allOnQueue y allOnConnection
  • Valores predeterminados de paginación
  • Espacios de nombres de sembradoras y fábricas

Cambios de impacto medio

  • PHP 7.3.0 requerido
  • Soporte de lote de tabla de trabajos fallidos
  • Actualizaciones del modo de mantenimiento
  • los php artisan down --message Opción
  • los assertExactJson Método

Actualización a 8.0 desde 7.x

Tiempo estimado de actualización: 15 minutos

Intentamos documentar todos los posibles cambios importantes. Dado que algunos de estos cambios importantes se encuentran en partes oscuras del marco, solo una parte de estos cambios pueden afectar su aplicación.

PHP 7.3.0 requerido

Probabilidad de impacto: media

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

Actualización de dependencias

Actualice las siguientes dependencias en su composer.json expediente:

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

Los siguientes paquetes de origen tienen nuevas versiones importantes para admitir Laravel 8. Si corresponde, debe leer sus guías de actualización individuales antes de actualizar:

Además, el instalador de Laravel se ha actualizado para admitir composer create-project y Laravel Jetstream. Cualquier instalador anterior a 4.0 dejará de funcionar después de octubre de 2020. Debe 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á utilizando la versión adecuada para el soporte de Laravel 8.

Colecciones

los isset Método

Probabilidad de impacto: baja

Para ser coherente con el comportamiento típico de PHP, el offsetExists método de IlluminateSupportCollection 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 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

Espacios de nombres de sembradoras y fábricas

Probabilidad de impacto: alta

Las sembradoras y las fábricas ahora tienen un espacio de nombres. Para adaptarse a estos cambios, agregue el DatabaseSeeders espacio de nombres a sus clases de sembradora. Además, el anterior database/seeds el directorio debe cambiarse de nombre a database/seeders:

<?php

namespace DatabaseSeeders;

use AppModelsUser;
use IlluminateDatabaseSeeder;

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

Si elige utilizar el laravel/legacy-factories paquete, no se requieren cambios en sus clases de fábrica. Sin embargo, si está actualizando sus fábricas, debe agregar el DatabaseFactories espacio de nombres a esas clases.

A continuación, en tu composer.json archivo, eliminar classmap cuadra del autoload sección y agregue las nuevas asignaciones de directorio de clases con espacio de nombres:

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

Elocuente

Modelo Factories

Probabilidad de impacto: alta

La función de fábricas de modelos de Laravel se ha reescrito totalmente para admitir clases y no es compatible con las fábricas de estilo de Laravel 7.x. Sin embargo, para facilitar el proceso de actualización, un nuevo laravel/legacy-factories El paquete ha sido creado 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

los Castable Interfaz

Probabilidad de impacto: baja

los castUsing método del Castable La interfaz se ha actualizado para aceptar una serie de argumentos. Si está implementando esta interfaz, debe actualizar su implementación en consecuencia:

public static function castUsing(array $arguments);

Eventos de incremento / decremento

Probabilidad de impacto: baja

Los eventos de modelo relacionados con “actualizar” y “guardar” adecuados ahora se enviarán al ejecutar el increment o decrement métodos en instancias de modelo Eloquent.

Eventos

los Dispatcher Contrato

Probabilidad de impacto: baja

los listen método del IlluminateContractsEventsDispatcher El contrato ha sido actualizado para hacer el $listener propiedad opcional. Este cambio se realizó para admitir la detección automática de tipos de eventos manejados a través de la reflexión. Si está implementando manualmente esta interfaz, debe actualizar su implementación en consecuencia:

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

Estructura

Actualizaciones del modo de mantenimiento

Probabilidad de impacto: opcional

La función del modo de mantenimiento de Laravel se ha mejorado en Laravel 8.x. Ahora se admite la representación previa de la plantilla del modo de mantenimiento y se elimina la posibilidad de que los usuarios finales encuentren errores durante el modo de mantenimiento. Sin embargo, para respaldar esto, se deben agregar las siguientes líneas a su public/index.php expediente. Estas líneas deben colocarse directamente debajo de la existente LARAVEL_START definición constante:

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

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

los php artisan down --message Opción

Probabilidad de impacto: media

los --message opción de la php artisan down El comando ha sido eliminado. Como alternativa, considere renderizar previamente sus vistas del modo de mantenimiento con el mensaje de su elección.

los php artisan serve --no-reload Opción

Probabilidad de impacto: baja

A --no-reload se ha añadido la opción a la php artisan serve mando. Esto indicará al servidor integrado que no vuelva a cargar el servidor cuando se detecten cambios en el archivo de entorno. Esta opción es principalmente útil cuando se ejecutan pruebas de Laravel Dusk en un entorno de CI.

Gerente $app Propiedad

Probabilidad de impacto: baja

El anteriormente en desuso $app propiedad de la IlluminateSupportManager la clase ha sido eliminada. Si confiaba en esta propiedad, debería usar el $container propiedad en su lugar.

los elixir Ayudante

Probabilidad de impacto: baja

El anteriormente en desuso elixir se ha eliminado el ayudante. Se anima a las aplicaciones que todavía utilizan este método a actualizar a Mezcla de Laravel.

Correo

los sendNow Método

Probabilidad de impacto: baja

El anteriormente en desuso sendNow El método ha sido eliminado. En su lugar, utilice el send método.

Paginación

Valores predeterminados de paginación

Probabilidad de impacto: alta

El paginador ahora usa el Marco CSS Tailwind por su estilo predeterminado. Para seguir usando Bootstrap, debe agregar la siguiente llamada al método al boot método de su aplicación AppServiceProvider:

use IlluminatePaginationPaginator;

Paginator::useBootstrap();

Cola

los retryAfter Método

Probabilidad de impacto: alta

Para mantener la coherencia con otras características de Laravel, el retryAfter método y retryAfter Se ha cambiado el nombre de la propiedad de trabajos en cola, remitentes de correo, notificaciones y oyentes a backoff. Debe actualizar el nombre de este método / propiedad en las clases relevantes en su aplicación.

los timeoutAt Propiedad

Probabilidad de impacto: alta

los timeoutAt La propiedad de trabajos en cola, notificaciones y escuchas ha cambiado de nombre a retryUntil. Debe actualizar el nombre de esta propiedad en las clases relevantes de su aplicación.

los allOnQueue() / allOnConnection() Métodos

Probabilidad de impacto: alta

Para mantener la coherencia con otros métodos de envío, allOnQueue() y allOnConnection() Se han eliminado los métodos utilizados con el encadenamiento de trabajos. Puede utilizar el onQueue() y onConnection() métodos en su lugar. Estos métodos deben llamarse antes de llamar al dispatch método:

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

Tenga en cuenta que este cambio solo afecta al código que utiliza el withChain método. los allOnQueue() y allOnConnection() todavía están disponibles cuando se utiliza el global dispatch() ayudante.

Soporte de lote de tabla de trabajos fallidos

Probabilidad de impacto: opcional

Si planea utilizar las funciones de procesamiento por lotes de trabajos de Laravel 8.x, su failed_jobs será necesario actualizar la tabla de la base de datos. Primero, un nuevo uuid La columna debe agregarse a su tabla:

use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

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

A continuación, el failed.driver opción de configuración dentro de su queue El archivo de configuración debe actualizarse a database-uuids.

Además, es posible que desee generar UUID para sus trabajos fallidos existentes:

DB::table('failed_jobs')->whereNull('uuid')->cursor()->each(function ($job) {
    DB::table('failed_jobs')
        ->where('id', $job->id)
        ->update(['uuid' => (string) IlluminateSupportStr::uuid()]);
});

Enrutamiento

Prefijo automático del espacio de nombres del controlador

Probabilidad de impacto: opcional

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

En Laravel 8, esta propiedad se establece en null por defecto. Esto permite que las declaraciones de ruta de su controlador utilicen la sintaxis invocable estándar de PHP, que proporciona un mejor soporte para saltar a la clase de controlador en muchos IDE:

use AppHttpControllersUserController;

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

// Using string syntax...
Route::get('/users', 'AppHttpControllers[email protected]');

En la mayoría de los casos, esto no afectará a las aplicaciones que se están actualizando porque su RouteServiceProvider todavía contendrá el $namespace Propiedad con su valor anterior. Sin embargo, si actualiza su aplicación creando un nuevo proyecto de Laravel, puede encontrar esto como un cambio importante.

Si desea continuar usando el enrutamiento del controlador con prefijo automático original, simplemente puede establecer el valor del $namespace propiedad dentro de su RouteServiceProvider y actualizar los registros de ruta dentro del boot método para usar el $namespace propiedad:

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 = 'AppHttpControllers';

    /**
     * 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);
        });
    }
}

Planificación

los cron-expression Biblioteca

Probabilidad de impacto: baja

La dependencia de Laravel en dragonmantank/cron-expression ha sido actualizado desde 2.x para 3.x. Esto no debería causar ningún cambio importante en su aplicación a menos que esté interactuando con el cron-expression biblioteca directamente. Si está interactuando con esta biblioteca directamente, revise su cambio de registro.

Sesión

los Session Contrato

Probabilidad de impacto: baja

los IlluminateContractsSessionSession contrato ha recibido un nuevo pull método. Si está implementando este contrato 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);

Pruebas

los decodeResponseJson Método

Probabilidad de impacto: baja

los decodeResponseJson método que pertenece al IlluminateTestingTestResponse la clase ya no acepta ningún argumento. Considere usar el json método en su lugar.

los assertExactJson Método

Probabilidad de impacto: media

los assertExactJson El método ahora requiere claves numéricas de matrices comparadas para coincidir y estar en el mismo orden. Si desea comparar JSON con una matriz sin requerir que las matrices con clave numérica tengan el mismo orden, puede usar el assertSimilarJson método en su lugar.

Validación

Conexiones de reglas de base de datos

Probabilidad de impacto: baja

los unique y exists Las reglas ahora respetarán el nombre de conexión especificado (al que se accede a través del modelo getConnectionName método) de los modelos Eloquent al realizar consultas.

Diverso

También le animamos a que vea los cambios en el laravel/laravel Repositorio de GitHub. Si bien muchos de estos cambios no son necesarios, es posible que desee mantener estos archivos sincronizados 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. Puede ver fácilmente los cambios con el Herramienta de comparación de GitHub y elija qué actualizaciones son importantes para usted.