多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# # 升级说明 ## 从 5.6 升级到 5.7 #### 预计升级时间:10-15分钟 >[success] 注:我们试图记录每一个可能发生的变化。因为大部分破坏性的变化在框架的内部,这些更改仅有一部分的更改可能影响你的应用。 ### 更新依赖 在`composer.json`文件中更新`laravel/framework`依赖到`5.7.*`。 当然,不要忘记检查应用所使用的第三方扩展包是否支持 Laravel 5.7。 ### 应用 #### `register`方法 **影响的可能性:非常低** `Illuminate\Foundation\Application`类`register`方法中,未使用的参数`options`已经被移出,如果你重写了这个方法,需要更新方法的签名: ~~~php /** * 使用应用程序注册服务提供者。 * * @param \Illuminate\Support\ServiceProvider|string $provider * @param bool $force * @return \Illuminate\Support\ServiceProvider */ public function register($provider, $force = false); ~~~ ### Artisan #### 调度任务链接 & 队列 **影响的可能性:低** >[warning]在作业类中,如果一个连接 / 任务没有明确地传递给`job`方法的话,`$schedule->job`方法现在将识别任务类上设置`queue`和`connection`属性。 一般来说,这应该被认为是一个 bug 修复,然而,它被列为一个破坏性的改变。「[如果你遇到任何关于这个变化的问题,请告诉我们](https://github.com/laravel/framework/pull/25216)」。 ### 认证 #### `Authenticate`中间件 **影响的可能性:低** >[warning]`Illuminate\Auth\Middleware\Authenticate`中间件的`authenticate`方法会被更新为将`$request`作为第一个参数,如果你在自己的`Authenticate`中间件中重写了这个方法,需要更新中间件方法的签名: ~~~php /** * 确认用户是否登录到任何给定的警卫。 * * @param \Illuminate\Http\Request $request * @param array $guards * @return void * * @throws \Illuminate\Auth\AuthenticationException */ protected function authenticate($request, array $guards) ~~~ #### `ResetsPasswords`Trait **影响的可能性:低** >[warning]`ResetsPasswords`trait 中受保护的方法`sendResetResponse`现在接收`Illuminate\Http\Request`作为第一个参数。如果你覆盖了这个方法,你需要修改方法的签名: ~~~php /** * 获取重置密码成功的响应。 * * @param \Illuminate\Http\Request $request * @param string $response * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse */ protected function sendResetResponse(Request $request, $response) ~~~ #### `SendsPasswordResetEmails`Trait **影响的可能性:低** >[warning]`SendsPasswordResetEmails`trait 中受保护的方法`sendResetLinkResponse`现在接收`Illuminate\Http\Request`作为第一个参数。如果你覆盖了这个方法,你需要修改方法的签名: ~~~php /** * 获取重置密码成功链接的响应。 * * @param \Illuminate\Http\Request $request * @param string $response * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse */ protected function sendResetLinkResponse(Request $request, $response) ~~~ ### 授权 #### The`Gate`契约 **影响的可能性:非常低** >[warning]`raw`方法的可见性从`protected`变成`public`。此外,[它也被添加到了`Illuminate/Contracts/Auth/Access/Gate`契约中](https://github.com/laravel/framework/pull/25143): ~~~php /** * 获取授权回调的结果。 * * @param string $ability * @param array|mixed $arguments * @return mixed */ public function raw($ability, $arguments = []); ~~~ 如果你要实现这个接口,你需要把这个方法添加到实现中。 ### Blade #### The`or`操作符 **影响的可能性:高** >[warning]Blade 的「or」操作符被移除了,可以使用 PHP 内置的`??`操作符替代: ~~~php // Laravel 5.6... {{ $foo or 'default' }} // Laravel 5.7... {{ $foo ?? 'default' }} ~~~ ### Carbon **影响的可能性:非常低** >[warning]Carbon「macros」不再由 Laravel 的扩展库处理,而是直接通过 Carbon 库处理。我们希望这些变化没有对你的代码造成影响,但是如果有问题的话你可以[联系我们](https://github.com/laravel/framework/pull/23938)。 ### Collections #### `split`函数 **影响可能性: 低** >[warning]`split`函数[已经更新为一直返回请求数量分块的个数](https://github.com/laravel/framework/pull/24088),除非原始集合的总数小于请求分块的个数.。准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。 ### Cookie #### `Factory`契约方法的参数 **影响可能性: 非常低** >[warning]`Illuminate/Contracts/Cookie/Factory`接口的`make`和`forever`方法的参数默认值[有变动](https://github.com/laravel/framework/pull/23200). 如果你实现了这个接口的话,你应该更新你的实现方法。 ### 数据库 #### `softDeletesTz`迁移方法 **影响可能性: 低** >[warning]表结构生成器的`softDeletesTz`方法现在接收列名作为第一个参数,而`$precision`字段已经移动到了第二个参数的位置: ~~~php /** * 在表中添加一个 "deleted at" 的时间戳. * * @param string $column * @param int $precision * @return \Illuminate\Support\Fluent */ public function softDeletesTz($column = 'deleted_at', $precision = 0) ~~~ #### `ConnectionInterface`契约 **影响可能性: 非常低** >[warning]`Illuminate\Contracts\Database\ConnectionInterface`契约的`select`和`selectOne`函数参数更新为提供新的`$useReadPdo`参数: ~~~php /** * 执行select语句并返回一条结果. * * @param string $query * @param array $bindings * @param bool $useReadPdo * @return mixed */ public function selectOne($query, $bindings = [], $useReadPdo = true); /** * 在数据库执行select语句. * * @param string $query * @param array $bindings * @param bool $useReadPdo * @return array */ public function select($query, $bindings = [], $useReadPdo = true); ~~~ 同时, 将`cursor`方法添加到当前契约中: ~~~php /** * 通过数据库执行select语句并返回一个生成器. * * @param string $query * @param array $bindings * @param bool $useReadPdo * @return \Generator */ public function cursor($query, $bindings = [], $useReadPdo = true); ~~~ 如果你实现了此接口的话,请将此方法添加到您的实现中。 #### SQL Server驱动优先级 **影响可能性: 低** >[warning]在 Laravel 5.7之前,`PDO_DBLIB`驱动是默认的SQL Server PDO 驱动。 这个驱动是被微软反对的. 在Laravel 5.7中,如果`PDO_SQLSRV`驱动可用的话,`PDO_SQLSRV`将作为默认的驱动. 或者你可以选择使用`PDO_ODBC`驱动: ~~~php 'sqlsrv' => [ // ... 'odbc' => true, 'odbc_datasource_name' => 'your-odbc-dsn', ], ~~~ 如果这些驱动都不可用, Laravel 将使用`PDO_DBLIB`驱动。 ### Debug #### Dumper 类 **影响可能性: 非常低** >[warning]为了支持Symfony原生的方法dumpers:`Symfony\Component\VarDumper\VarDumper`和`Symfony\Component\VarDumper\Dumper\HtmlDumper`, `Illuminate\Support\Debug\Dumper`和`Illuminate\Support\Debug\HtmlDumper`方法已被移除。 ### Eloquent #### `latest`/`oldest`方法 **影响可能性: 低** >[warning]Eloquent查询构造器的`latest`和`oldest`方法更新,现在允许通过自定义的"创建时间"的数据库字段对查询的模型镜像排序。 准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。 #### `wasChanged`方法 **影响可能性: 非常低** >[warning]Eloquent更改`wasChanged`方法将在`updated`模型事件**之前**调用,这一改变现在可用了。准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。[如果你对此更新有任何疑问,请联系我们](https://github.com/laravel/framework/pull/25026)。 #### PostgreSQL 特殊浮点值 **影响的可能性:低** >[warning]PostgreSQL 支持`Infinity`,`-Infinity`和`NaN`浮点值,在Laravel 5.7 之前的版本,当 Eloquent 模型实例中要转换数据类型的列为`float`、`double`或`real`时,会被转换成`0`。 而在Laravel 5.7中,这些值会被转换成相应的 PHP 常量`INF`、`-INF`和`NAN`。 ### Email 认证 **影响的可能性:可选** >[warning]如果你选择使用 Laravel 的[Email 认证服务](https://laravel-china.org/docs/laravel/5.7/verification),需要向你的应用中增加一些手脚架。 >[]首先,增加`VerificationController`到你的应用:[App\\Http\\Controllers\\Auth\\VerificationController](https://github.com/laravel/laravel/blob/develop/app/Http/Controllers/Auth/VerificationController.php)。 其次,增加认证视图文件,文件位置在`resources/views/auth/verify.blade.php`,视图内容可以从[GitHub](https://github.com/laravel/framework/blob/5.7/src/Illuminate/Auth/Console/stubs/make/views/auth/verify.stub)中获取。 最后,在调用`Auth::routes`方法时传递`verify`选项: ~~~php Auth::routes(['verify' => true]); ~~~ ### 文件系统 #### `Filesystem`契约方法 **影响的可能性:低** >[warning][`Illuminate\Contracts\Filesystem\Filesystem`](https://github.com/laravel/framework/pull/23755)契约中增加了`readStream`和`writeStream`方法,如果你正在实现这个接口,请增加这些方法。 ### Mail #### 邮件动态传参转换 **影响的可能性:中** >[warning]向邮件视图中动态传递的变量[现在会自动转换为"驼峰命名"](https://github.com/laravel/framework/pull/24232),这使邮件动态变量行为和动态视图变量保持一致。因为动态邮件变量非 Laravel 文档特性,所以对你的应用产生影响的可能性很小。 ### 路由 #### `Route::redirect`方法 **影响的可能性:高** >[warning]`Route::redirect`方法现在返回 HTTP 状态码为`302`的重定向,新增`permanentRedirect`方法实现`301`重定向。 ~~~php // 返回302重定向... Route::redirect('/foo', '/bar'); // 返回301重定向... Route::redirect('/foo', '/bar', 301); // 返回301重定向... Route::permanentRedirect('/foo', '/bar'); ~~~ #### `addRoute`方法 **影响的可能性:低** >[warning]`Illuminate\Routing\Router`类的`addRoute`方法的可见性从`protected`改为`public`。 ### 表单验证 #### 嵌套验证数据 **影响的可能性:中** >[warning]在以前版本的 Laravel 中,`validate`方法对嵌套验证规则返回的结果不正确,在 Laravel 5.7中已修复: ~~~php $data = Validator::make([ 'person' => [ 'name' => 'Taylor', 'job' => 'Developer' ] ], ['person.name' => 'required'])->validate(); dump($data); // 旧的结果... ['person' => ['name' => 'Taylor', 'job' => 'Developer']] // 新的结果... ['person' => ['name' => 'Taylor']] ~~~ #### `Validator`Contract **影响的可能性:非常低** >[warning][`Illuminate/Contracts/Validation/Validator`契约新增](https://github.com/laravel/framework/pull/25128)`validate`方法: ~~~php /** * 根据数据运行表单验证规则。 * * @return array */ public function validate(); ~~~ 如果你正实现这个接口,请新增此方法。 >[danger] 建议参考 `laravel/laravel`[GitHub 仓库](https://github.com/laravel/laravel)中的修改记录