升级指南
预计升级时间:10-30分钟
PHP
Laravel 5.6 需要 PHP 7.1.3 或更高版本。更新依赖
在composer.json
中更新 laravel/framework
依赖到 5.6.*
,更新 fideloper/proxy
依赖到 ~4.0
。
此外,如果你使用下以下官方扩展包,也要升级它们到最新版本:
- Dusk (升级到
~3.0
) - Passport (升级到
~5.0
) - Scout (升级到
~4.0
)
当然,不要忘了检查应用所使用的第三方扩展包是否支持 Laravel 5.6,如果需要升级的话也要更新。
Symfony 4
Laravel 底层使用的所有 Symfony 组件都已经升级到 Symfony ~4.0
版本。如果你在应用代码中使用了 Symfony 组件,需要查看 Symfony 更新日志以确认是否需要修改代码。
PHPUnit
需要更新应用的 phpunit/phpunit
依赖到 ~7.0
。
数组
Arr::wrap
方法
在 Laravel 5.6 中,传递 null
到 Arr::wrap
方法将会返回空数组。
Artisan
optimize
命令
之前版本中废弃的 optimize
命令已经被彻底移除。由于 PHP 自身的性能优化,optimize
命令已经不能给应用提供显著的性能提升,所以,你需要从 composer.json
文件的 scripts
部分移除 php artisan optimize
。
Blade
HTML 实体编码
在之前版本的 Laravel 中,Blade 不会对 HTML 实体进行双重编码。这并不是底层 htmlspecialchars 函数的默认行为,而且会在渲染内容或传递内联 JSON 内容到 JavaScript 框架时导致预期之外的结果。
在 Laravel 5.6 中,Blade 以及辅助函数 e
默认会对特殊字符进行双重编码,从而与 PHP 底层 htmlspecialchars
函数的默认行为保持一致。如果你想要维持不进行双重编码的旧状,可以使用 Blade::withoutDoubleEncoding
方法:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}
缓存
频率限制器 tooManyAttempts
方法
该方法签名中未使用的 $decayMinutes
参数被移除。如果你通过自己的实现重写了该方法,也要从方法签名中移除该参数。
数据库
Morph 列的索引顺序
为了获得更好的性能,迁移方法 morphs
构建的列索引顺序倒过来了,如果你在某个迁移中使用了 morphs
方法,尝试运行该迁移的 down
方法时会报错。如果应用还在开发中,可以使用 migrate:fresh
命令重构数据库结构;如果应用已经上线,需要显式传递索引名称到 morphs
方法。
MigrationRepositoryInterface 新增方法
MigrationRepositoryInterface
中新增了一个 getMigrationsBatches
方法。如果非常不巧你正在自定义该类的实现,需要添加这个方法的实现。你可以以框架的默认实现作为示例。
Eloquent
getDateFormat
方法
getDateFormat
方法的可见性从 protected
调整为 public
。
哈希
新配置文件
所有哈希配置现在位于独立的 config/hashing.php
配置文件。你可以拷贝一份默认配置文件到你的应用。大多数情况下,我们都会将 bcrypt
驱动作为默认驱动。不过,也支持 argon
。
辅助函数
e
在之前版本的 Laravel 中,Blade (以及辅助函数 e
)不会对 HTML 实体进行双重编码。这并不是底层 htmlspecialchars 函数的默认行为,而且会在渲染内容或传递内联 JSON 内容到 JavaScript 框架时导致预期之外的结果。
在 Laravel 5.6 中,Blade 以及辅助函数 e
默认会对特殊字符进行双重编码,从而与 PHP 底层 htmlspecialchars
函数的默认行为保持一致。如果你想要维持不进行双重编码的旧状,可以传递 false
作为第二个参数到 e
函数:
<?php echo e($string, false); ?>
日志
新配置文件
所有的日志配置现在都存放在独立的 config/logging.php
配置文件。你可以拷贝一份默认的配置文件到你的应用然后基于应用需要进行设置。
log
和 log_level
配置项都可以从配置文件 config/app.php
里移除了。
configureMonologUsing
方法
如果你在使用 configureMonologUsing
方法为应用自定义 Monolog 实例,现在需要创建一个 custom
日志频道。更多关于如何创建自定义频道的信息,可以查看完整的日志文档。
日志 Writer
类
Illuminate\Log\Writer
类被重命名为 Illuminate\Log\Logger
,如果你在应用的某个类中对这个类进行了显式的类型提示作为依赖注入,需要更新该类的引用为新的类名。或者,作为替代方案,你可以考虑将类型提示调整为标准的 Psr\Log\LoggerInterface
接口。
Illuminate\Contracts\Logging\Log
接口
该接口已经被移除,因为它和 Psr\Log\LoggerInterface
接口完全重合,需要将引用它的地方都调整为 Psr\Log\LoggerInterface
接口。
邮件
withSwiftMessage
回调
在之前版本的 Laravel 中,使用 withSwiftMessage
注册的 Swift 消息自定义回调函数在内容已经被编码并添加到消息后被调用。这些回调现在在内容被添加前调用,从而允许你自定义编码以及其他消息选项。
分页
Bootstrap 4
分页器生成的分页链接现在默认使用 Bootstrap 4,要让分页器生成 Bootstrap 3 链接,需要在 AppServiceProvider
的 boot
方法中调用 Paginator::useBootstrapThree
方法:
<?php
namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapThree();
}
}
资源
original
属性
资源响应的 original
属性现在被设置为原始模型而不是 JSON 字符串/数组。这样在测试中就可以更好地检查响应的模型。
路由
返回新创建的模型
从路由中直接返回新创建的 Eloquent 模型时,响应状态码由 200
调整为 201
,如果应用的任意相应测试显式期望 200
状态码,那么需要将它们修改为 201
。
信任代理
由于信任代码功能使用的底层 Symfony HttpFoundation 有改动,所以必须微调 App\Http\Middleware\TrustProxies
中间件。
$headers
属性之前是个数组,现在是一个接收几个不同值的属性。例如,要信任所有转发头,需要像这样更新 $headers
属性:
use Illuminate\Http\Request;
/**
* The headers that should be used to detect proxies.
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
更多关于 $headers
变量值的信息可以查看完整的信任代理文档。
验证
ValidatesWhenResolved
接口
为了避免和 $request->validate()
方法冲突,ValidatesWhenResolved
接口/trait 的 validate
方法被重命名为 validateResolved
。
杂项
我们还鼓励你查看 laravel/laravel
代码仓库的更新日志。尽管其中的很多更新不是必须的,但是你可以将应用中的这些文件与代码仓库保持同步。其中的一些更新已经在这篇升级指南中覆盖到了,但是还有很多其他的小更新比如配置文件或注释的微调,就不会一一指出。你可以通过 GitHub 比较工具 轻松查看变更以便选择那些对你而言更为重要的更新。
No Comments