Laravel 10 向 PHP 8.0说再见!新功能和更新有哪些?
Laravel 10标志
正如你已经知道的, Laravel 10还没有发布. 然而, 我们将保持这篇文章的更新,提供所有关于预期发布的新鲜信息。因此, 我们建议把这个页面加入书签,并不时地重温一下。
Laravel 10的新功能和更新
毫无疑问,任何新版本最令人兴奋的部分是增加了新的功能。所以不用多说, 让我们先来看看Laravel 10的新功能和更新。
1. PHP 8.1: 在Laravel 10的核心
PHP 8.1是Laravel 10中最低要求的PHP版本。根据Laravel 9分支和GitHub上的框架主分支的比较,一些PHP 8.1的功能,如 readonly
属性和 array_is_list
,预计将在Laravel 10中引入。
2. 对PHP 8.2的支持
PHP 8.2是在2022年12月8日发布的, 离Laravel 10的发布日期只有两个月。然而,这不应该阻止你利用PHP 8.2的功能,因为不需要做任何额外的事情,Laravel 10就可以为PHP 8.2做好准备。
事实上, 整个Laravel生态系统, 包括Forge, Vapor, 和Envoyer, 都支持PHP 8.2, 而且你甚至可以在Laravel 9中使用PHP 8.2。这有多酷啊!
3. Laravel入门套件升级
Laravel Breeze和Jetstream已经准备好使用Laravel 10,一旦它被发布。此外, 他们也已经升级到Inertiajs 1了,JetStream有一个惊喜,就是完全支持黑暗模式。
4. Predis版本升级
Predis是一个强大的Redis客户端,用于PHP,可能会帮助你获得最大的缓存,以提供一个美妙的用户体验。Laravel以前支持1和2两个版本, 但从Laravel 10开始, 该框架不再支持Predis 1.
虽然Laravel文档中提到Predis是与Redis互动的包,但你也可以使用官方的PHP扩展。这个扩展提供了一个与Redis服务器通信的API.
5. 本地类型声明
Laravel曾经在它的骨架代码中使用DocBlocks来澄清一段代码的作用,以及期待什么样的参数或响应。然而, 多亏了Laravel 10中的本地类型声明, 这将改变。
解释这一变化的最好方式是用一个简单的例子。取而代之的是一个看起来像这样的函数:
…它将看起来像这样:
这一变化纯粹是为了有利于开发人员的体验,因为IDE会知道预期参数和响应的形状。它将提供更好的类型清晰度,而这是通过PHP本地类型无法做到的。因此,它将帮助代码编辑器更好地发挥自动完成功能。
6. 所有的验证规则都是默认可调用的
如果你想在Laravel 9中制作一个可调用的验证规则, 你需要在artisan命令后添加 --invokable
标志。这不再是必要的,因为所有Laravel 10的规则都是默认可调用的。所以, 你可以运行下面的命令来创建一个新的Laravel 10的可调用规则:
7. 本地列的修改支持
为了消除使用 change()
修改列时对 doctrine/dbal
包的需求, Laravel 10将有一个新功能。这个功能将允许开发人员使用 change()
方法和修改MySQL, PostgreSQL, 和SQL Server上的列,而不需要额外的包。这是一个重大的和有风险的突破性变化,但我们相信这是值得的, 因为它将消除对额外包的需求.
为了更好地理解这个新功能,请看下面的例子:
现在, 我们假设我们有一个 user_balance
的列,我们想改变它的类型。从Laravel 10开始,我们可以简单地这样做:
上面的代码将成功地改变列的类型,但也会放弃 UNSIGNED
, DEFAULT
和 COMMENT
属性。因此,当你改变一个列的类型时,记住添加所有的属性是很重要的:
在你有多个数据库连接并且已经安装了 doctrine/dbal
的情况下,建议在 App\Providers\AppServiceProvider
的 boot
方法中调用 Schema::useNativeSchemaOperationsIfPossible()
方法,以便能够使用本地模式操作,在依赖包之前使用本地操作(例如,SQLite还不支持这个):
8. 列类型的本地检索
Laravel 10的另一个值得注意的特点是能够使用 Schema::getColumnType
方法,而不需要依赖 doctrine/dbal
包。目前我们使用 Schema::getColumnType
和 doctrine/dbal
来获取列的类型. doctrine/dbal
将每一个本地的列类型映射到它的 doctrine/dbal
类型等价物, 而且它不支持Laravel在不同数据库中使用的许多列类型.
另一方面,在Laravel 10中,新的 Schema::getColumnType
方法将返回实际的列类型,而不是其 doctrine/dbal
等价物。它还可以让你为新的本地列修改功能编写集成测试。你可以使用这个功能来获得指定列的数据类型名称或整个类型定义:
9. 更快的哈希算法
xxHash是一种速度惊人的哈希算法。它具有很好的输出随机性和分散性,以及唯一性以减少碰撞。由于PHP 8.1提供了对xxh128的支持,而Laravel 10运行在PHP 8.1上,在Laravel 10中拥有这样一个可靠的哈希算法是非常理想的。
值得一提的是,Taylor在审查这一变化时强调,一些第三方软件包可能依赖于文件名与SHA-1散列的确切格式,这是Laravel用于散列的算法。因此, 如果你计划升级到Laravel 10, 最好在你的应用程序中使用的任何第三方软件包中仔细检查一下.
10. Eloquent Builder的whereExists()方法支持
目前, 使用 whereExists()
需要使用闭包来配置嵌套查询. 幸运的是, 在Laravel 10中, 现在可以将Eloquent Builder作为一个嵌套查询。它可以实现自定义构建器方法,模型作用域等的使用。
例如,我们通常会这样做,如果我们想使用 whereExists()
:
有了Laravel 10, 我们就可以这样做:
11. 急加载优化
Laravel 10的一个有趣的新功能是当没有任何键被加载时的急加载优化。这个变化与其说是一个功能, 不如说是一个修正, 因为它解决了当前的一个问题, 即急于加载关系导致大量不可能的查询被执行.
目前,当急于加载关系,没有任何键被加载,Laravel仍然会执行类似于这样的查询 select \* from `table_name` where 0 = 1
然而,新的Laravel 10更新检查以验证是否有任何可用的键,如果没有,提供一个空集合,消除了不必要的数据库查询。
Laravel 10中弃用的方法和包
Laravel 10向PHP 8.0说再见
Laravel框架将在Laravel 10中放弃对PHP 8.0的支持。因此, 如果你打算将你的应用程序升级到Laravel 10, 你必须先将PHP版本更新到PHP 8.1或PHP 8.2.
Laravel 10弃用方法和删除
我们可以看到,Laravel核心团队正在从Laravel 10分支中删除Laravel 9中的弃用方法。我们预测团队会在Laravel 10发布后尽快更新文档的升级指南,以包括所有弃用的方法和包。
如果你要把目前的项目迁移到Laravel 10,任何使用弃用方法的代码都应该用新的方法重新编写,以达到相同的效果。
下面是我们在比较Laravel 9和主分支时发现的所有弃用和删除的列表:
Route::home
方法(在Laravel 9中被弃用)- 围绕
dispatchNow
的弃用函数和方法. 这是为了鼓励开发人员使用dispatchSync
,这是唯一支持的立即调度的方式。 getBaseQuery
,因为它有一个toBase等价物。- 不再使用的
MaintenanceModeException
类 MocksApplicationServices
特质- mail fake的
Mail::failures
方法 - 被弃用的
$dates
属性,建议使用$casts代替 assertTimesSent()
方法- 放弃了对
Predis
1 和doctrine/dbal
2的支持 - 自从Laravel放弃对版本2的支持后,
doctrine/dbal
中所有相关的弃用。
如何安装Laravel 10
Laravel 10现在已经可以使用了, 你可以去体验和测试它的功能. 在Laravel安装程序中的 –dev
标志会安装来自 laravel/laravel
仓库的主分支。你所要做的就是在你的终端运行这个命令:
或者,如果你喜欢使用Composer:
为了更好地理解Composer命令,这里有一个快速解释:
- laravel/laravel:用于安装Laravel的软件包
- example-kinsta-app::你的新项目的新目录(可以改变)
- dev-master:Laravel的下一个版本(在这个例子中, Laravel 10)
安装Laravel 10后, 你可以通过导航到新目录example-wbolt-app并运行artisan命令来确认版本:
如何将一个项目升级到Laravel 10
你是否想升级到Laravel 10? Laravel核心团队在文档上努力工作,以提供一个无缝和直接的升级指南,同时涵盖每一个可能的突破性变化。请随时查看Laravel 10的升级指南,因为现在已经有一些关于升级过程的信息.
一旦Laravel 10发布,你也应该关注Laravel Shift。它提供了一个简单和自动化的方法来升级你的Laravel版本。
除了Laravel文档和Laravel Shift之外, 我们Kinsta将发布一个全面的升级指南,其中有真实的例子。所以, 不要忘了把这个页面收藏起来, 一旦Laravel 10发布, 再回来看看.
如何部署Laravel 10项目
部署Laravel 10应该和部署Laravel 9项目没有太大区别。下面是我们期望的服务器要求可能是这样的:
- PHP >= 8.1
- BCMath PHP扩展
- Ctype PHP扩展
- cURL PHP扩展
- DOM PHP扩展
- Fileinfo PHP扩展
- JSON PHP扩展
- Mbstring PHP扩展
- OpenSSL PHP扩展
- PCRE PHP扩展
- PDO PHP扩展
- Tokenizer PHP扩展
- XML PHP扩展