- Actualización a 8.0 desde 7.x
Cambios de alto impacto
- Modelo Factories
- Cola
retryAfter
Método - Cola
timeoutAt
Propiedad - Cola
allOnQueue
yallOnConnection
- 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.