升级指南
从 5.6 升级到 5.7.0
预计升级时间:10 - 15 分钟
我们尝试记录每一个可能的重大变更。由于其中一些变更位于框架的偏僻部分,只有一部分变更可能会实际影响到您的应用程序。
更新依赖
在您的 composer.json
文件中,将 laravel/framework
依赖更新为 5.7.*
。
如果您使用 Laravel Passport,您应该在 composer.json
文件中将 laravel/passport
依赖更新为 ^7.0
。
接下来,检查您的应用程序使用的任何第三方包,并验证您是否使用了支持 Laravel 5.7 的正确版本。
应用程序
register
方法
影响可能性:非常低
Illuminate\Foundation\Application
类的 register
方法中未使用的 options
参数已被移除。如果您重写了此方法,您应该更新方法的签名:
/**
* 在应用程序中注册服务提供者。
*
* @param \Illuminate\Support\ServiceProvider|string $provider
* @param bool $force
* @return \Illuminate\Support\ServiceProvider
*/
public function register($provider, $force = false);
Artisan
调度作业连接和队列
影响可能性:低
$schedule->job
方法现在会尊重作业类中的 queue
和 connection
属性,如果在 job
方法中没有显式传递连接/作业。
通常,这应该被视为一个错误修复;然而,出于谨慎考虑,它被列为一个重大变更。如果您遇到与此变更相关的问题,请告知我们。
资源
资源目录扁平化
影响可能性:无
对于新的 Laravel 5.7 应用程序,包含脚本和样式的资源目录已被扁平化到 resources
目录中。这不会影响现有应用程序,也不需要对现有应用程序进行更改。
然而,如果您希望进行此更改,您应该将所有文件从 resources/assets/*
目录上移一级:
- 从
resources/assets/js/*
到resources/js/*
- 从
resources/assets/sass/*
到resources/sass/*
然后,在您的 webpack.mix.js
文件中更新对旧目录的引用:
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
svg
目录添加
影响可能性:非常高
在 public
目录中添加了一个新的 svg
目录。它包含四个 svg 文件:403.svg
、404.svg
、500.svg
和 503.svg
,这些文件显示在各自的错误页面上。
您可以从 GitHub 获取这些文件。
认证
Authenticate
中间件
影响可能性:低
Illuminate\Auth\Middleware\Authenticate
中间件的 authenticate
方法已更新为接受传入的 $request
作为其第一个参数。如果您在自己的 Authenticate
中间件中重写了此方法,您应该更新中间件的方法签名:
/**
* 确定用户是否登录到任何给定的守卫。
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
* @throws \Illuminate\Auth\AuthenticationException
*/
protected function authenticate($request, array $guards)
ResetsPasswords
Trait
影响可能性:低
ResetsPasswords
trait 的受保护 sendResetResponse
方法现在接受传入的 Illuminate\Http\Request
作为其第一个参数。如果您重写了此方法,您应该更新方法的签名:
/**
* 获取成功密码重置的响应。
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
SendsPasswordResetEmails
Trait
影响可能性:低
SendsPasswordResetEmails
trait 的受保护 sendResetLinkResponse
方法现在接受传入的 Illuminate\Http\Request
作为其第一个参数。如果您重写了此方法,您应该更新方法的签名:
/**
* 获取成功密码重置链接的响应。
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetLinkResponse(Request $request, $response)
授权
Gate
合约
影响可能性:非常低
raw
方法的可见性从 protected
更改为 public
。此外,它被添加到 Illuminate\Contracts\Auth\Access\Gate
合约中:
/**
* 从授权回调中获取原始结果。
*
* @param string $ability
* @param array|mixed $arguments
* @return mixed
*/
public function raw($ability, $arguments = []);
如果您正在实现此接口,您应该将此方法添加到您的实现中。
Login
事件
影响可能性:非常低
Illuminate\Auth\Events\Login
事件的 __construct
方法有一个新的 $guard
参数:
/**
* 创建一个新的事件实例。
*
* @param string $guard
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param bool $remember
* @return void
*/
public function __construct($guard, $user, $remember)
如果您在应用程序中手动调度此事件,您需要将此新参数传递给事件的构造函数。以下示例将默认框架守卫传递给 Login 事件:
use Illuminate\Auth\Events\Login;
event(new Login(config('auth.defaults.guard'), $user, $remember))
Blade
or
操作符
影响可能性:高
Blade 的 "or" 操作符已被移除,取而代之的是 PHP 内置的 ??
"null coalesce" 操作符,它具有相同的目的和功能:
// Laravel 5.6...
{{ $foo or 'default' }}
// Laravel 5.7...
{{ $foo ?? 'default' }}
缓存
影响可能性:非常高
在 storage/framework/cache
中添加了一个新的 data
目录。您应该在自己的应用程序中创建此目录:
mkdir -p storage/framework/cache/data
然后,将一个 .gitignore 文件添加到新创建的 data
目录中:
cp storage/framework/cache/.gitignore storage/framework/cache/data/.gitignore
最后,确保 storage/framework/cache/.gitignore 文件更新如下:
*
!data/
!.gitignore
Carbon
影响可能性:非常低
Carbon "宏" 现在由 Carbon 库直接处理,而不是 Laravel 对库的扩展。我们不期望这会破坏您的代码;然而,如果您遇到与此变更相关的问题,请告知我们。
集合
split
方法
影响可能性:低
split
方法已更新为始终返回请求的 "组" 数量,除非原始集合中的项目总数少于请求的集合数。通常,这应该被视为一个错误修复;然而,出于谨慎考虑,它被列为一个重大变更。
Cookie
Factory
合约方法签名
影响可能性:非常低
Illuminate\Contracts\Cookie\Factory
接口的 make
和 forever
方法的签名已更改。如果您正在实现此接口,您应该在实现中更新这些方法。
数据库
softDeletesTz
迁移方法
影响可能性:低
架构表构建器的 softDeletesTz
方法现在接受列名作为其第一个参数,而 $precision
已移至第二个参数位置:
/**
* 为表添加一个 "deleted at" timestampTz。
*
* @param string $column
* @param int $precision
* @return \Illuminate\Support\Fluent
*/
public function softDeletesTz($column = 'deleted_at', $precision = 0)
ConnectionInterface
合约
影响可能性:非常低
Illuminate\Database\ConnectionInterface
合约的 select
和 selectOne
方法签名已更新以适应新的 $useReadPdo
参数:
/**
* 运行一个选择语句并返回单个结果。
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return mixed
*/
public function selectOne($query, $bindings = [], $useReadPdo = true);
/**
* 在数据库上运行一个选择语句。
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return array
*/
public function select($query, $bindings = [], $useReadPdo = true);
此外,cursor
方法已添加到合约中:
/**
* 在数据库上运行一个选择语句并返回一个生成器。
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return \Generator
*/
public function cursor($query, $bindings = [], $useReadPdo = true);
如果您正在实现此接口,您应该将此方法添加到您的实现中。
whereDate
方法
影响可能性:低
查询构建器的 whereDate
方法现在将 DateTime
实例转换为 Y-m-d
格式:
// 之前的行为 - SELECT * FROM `table` WHERE `created_at` > '2018-08-01 13:00:00'
$query->whereDate('created_at', '>', Carbon::parse('2018-08-01 13:00:00'));
// 当前行为 - SELECT * FROM `table` WHERE `created_at` > '2018-08-01'
$query->whereDate('created_at', '>', Carbon::parse('2018-08-01 13:00:00'));
迁移命令输出
影响可能性:非常低
核心迁移命令已更新以在迁移器类上设置输出实例。如果您重写或扩展了迁移命令,您应该删除对 $this->migrator->getNotes()
的引用,并使用 $this->migrator->setOutput($this->output)
。
SQL Server 驱动优先级
影响可能性:低
在 Laravel 5.7 之前,PDO_DBLIB
驱动被用作默认的 SQL Server PDO 驱动。此驱动被 Microsoft 视为已弃用。从 Laravel 5.7 开始,如果可用,将使用 PDO_SQLSRV
作为默认驱动。或者,您可以选择使用 PDO_ODBC
驱动:
'sqlsrv' => [
// ...
'odbc' => true,
'odbc_datasource_name' => 'your-odbc-dsn',
],
如果这些驱动都不可用,Laravel 将使用 PDO_DBLIB
驱动。
SQLite 外键
影响可能性:中等
SQLite 不支持删除外键。因此,在表上使用 dropForeign
方法现在会抛出异常。通常,这应该被视为一个错误修复;然而,出于谨慎考虑,它被列为一个重大变更。
如果您在多种类型的数据库上运行迁移,请考虑在迁移中使用 DB::getDriverName()
来跳过 SQLite 不支持的外键方法。
调试
Dumper 类
影响可能性:非常低
Illuminate\Support\Debug\Dumper
和 Illuminate\Support\Debug\HtmlDumper
类已被移除,取而代之的是使用 Symfony 的原生变量转储器:Symfony\Component\VarDumper\VarDumper
和 Symfony\Component\VarDumper\Dumper\HtmlDumper
。
Eloquent
latest
/ oldest
方法
影响可能性:低
Eloquent 查询构建器的 latest
和 oldest
方法已更新为尊重可以在您的 Eloquent 模型上指定的自定义 "created at" 时间戳列。通常,这应该被视为一个错误修复;然而,出于谨慎考虑,它被列为一个重大变更。
wasChanged
方法
影响可能性:非常低
Eloquent 模型的更改现在在触发 updated
模型事件之前可用于 wasChanged
方法。通常,这应该被视为一个错误修复;然而,出于谨慎考虑,它被列为一个重大变更。如果您遇到与此变更相关的问题,请告知我们。
PostgreSQL 特殊浮点值
影响可能性:低
PostgreSQL 支持浮点值 Infinity
、-Infinity
和 NaN
。在 Laravel 5.7 之前,当列的 Eloquent 转换类型为 float
、double
或 real
时,这些值被转换为 0
。
从 Laravel 5.7 开始,这些值将被转换为相应的 PHP 常量 INF
、-INF
和 NAN
。
邮件验证
影响可能性:可选
如果您选择使用 Laravel 的新邮件验证服务,您将需要向您的应用程序添加额外的脚手架。首先,将 VerificationController
添加到您的应用程序:App\Http\Controllers\Auth\VerificationController。
您还需要修改您的 App\User
模型以实现 MustVerifyEmail
合约:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
为了使用 verified
中间件,以便只有经过验证的用户才能访问给定的路由,您需要更新 app/Http/Kernel.php
文件的 $routeMiddleware
属性以包含新的 verified
和 signed
中间件:
// 在 App\Http\Kernel 类中...
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
您还需要验证视图存根。此视图应放置在 resources/views/auth/verify.blade.php
。您可以在 GitHub 上获取视图的内容。
接下来,您的用户表必须包含一个 email_verified_at
列,以存储电子邮件地址验证的日期和时间:
$table->timestamp('email_verified_at')->nullable();
为了在用户注册时发送电子邮件,您应该在 App\Providers\EventServiceProvider 类中注册以下事件和监听器:
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
/**
* 应用程序的事件监听器映射。
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
最后,在调用 Auth::routes
方法时,您应该将 verify
选项传递给该方法:
Auth::routes(['verify' => true]);
文件系统
Filesystem
合约方法
影响可能性:低
readStream
和 writeStream
方法已添加到 Illuminate\Contracts\Filesystem\Filesystem
合约中。如果您正在实现此接口,您应该将这些方法添加到您的实现中。
哈希
Hash::check
方法
影响可能性:无
check
方法现在可选地检查哈希的算法是否与配置的算法匹配。
邮件
可邮寄动态变量命名
影响可能性:低
动态传递给可邮寄视图的变量现在会自动 "驼峰化",这使得可邮寄动态变量行为与动态视图变量一致。动态可邮寄变量不是 Laravel 的文档化功能,因此对您的应用程序的影响可能性较低。
模板主题
影响可能性:中等
如果您自定义了用于 Markdown 可邮寄模板的默认主题样式,您将需要重新发布并重新进行自定义。按钮颜色类已从 'blue'、'green' 和 'red' 重命名为 'primary'、'success' 和 'error'。
队列
QUEUE_DRIVER
环境变量
影响可能性:非常低
QUEUE_DRIVER
环境变量已重命名为 QUEUE_CONNECTION
。这不应影响您正在升级的现有应用程序,除非您有意修改 config/queue.php
配置文件以匹配 Laravel 5.7。
WorkCommand
选项
影响可能性:非常低
stop-when-empty
选项已添加到 WorkCommand
。如果您扩展此命令,您需要将 stop-when-empty
添加到类的 $signature
属性中。
路由
Route::redirect
方法
影响可能性:高
Route::redirect
方法现在返回 302
HTTP 状态码重定向。permanentRedirect
方法已添加以允许 301
重定向。
// 返回 302 重定向...
Route::redirect('/foo', '/bar');
// 返回 301 重定向...
Route::redirect('/foo', '/bar', 301);
// 返回 301 重定向...
Route::permanentRedirect('/foo', '/bar');
addRoute
方法
影响可能性:低
Illuminate\Routing\Router
类的 addRoute
方法已从 protected
更改为 public
。
验证
嵌套验证数据
影响可能性:中等
在 Laravel 的早期版本中,validate
方法未返回嵌套验证规则的正确数据。这在 Laravel 5.7 中已得到纠正:
$data = Validator::make([
'person' => [
'name' => 'Taylor',
'job' => 'Developer'
]
], ['person.name' => 'required'])->validate();
dump($data);
// 之前的行为...
['person' => ['name' => 'Taylor', 'job' => 'Developer']]
// 新行为...
['person' => ['name' => 'Taylor']]
Validator
合约
影响可能性:非常低
validate
方法已添加到 Illuminate\Contracts\Validation\Validator
合约中:
/**
* 根据其数据运行验证器的规则。
*
* @return array
*/
public function validate();
如果您正在实现此接口,您应该将此方法添加到您的实现中。
测试
影响可能性:中等
Laravel 5.7 为 Artisan 命令引入了改进的测试工具。默认情况下,Artisan 命令输出现在被模拟。如果您依赖 artisan
方法作为测试的一部分运行命令,您应该使用 Artisan::call
或在测试类中定义 public $mockConsoleOutput = false
属性。
杂项
我们还鼓励您查看 laravel/laravel
GitHub 仓库 中的更改。虽然这些更改中的许多不是必需的,但您可能希望将这些文件与您的应用程序保持同步。这些更改中的一些将在本升级指南中介绍,但其他更改,例如配置文件或注释的更改,将不会介绍。您可以使用 GitHub 比较工具 轻松查看更改,并选择哪些更新对您来说是重要的。