Laravel 10 的新特性:深入了解最新的更新和功能

已发表: 2023-01-25

在广受欢迎的 Laravel 框架推出十多年后,您是否想过,“Laravel 还能为 PHP 开发人员提供什么?”

鉴于它已经为初学者和专业开发人员简化了 PHP 开发,有些人甚至可能会争辩说,它已经宠坏了开发人员,让他们相信 PHP 是目前最简单的编程语言。

那么,Laravel 是否还会为 Laravel 开发者带来更多惊喜呢? 或者它已经用尽了所有可能的方式来支持 PHP 开发人员?

好吧,至少,我们知道 Laravel 10 可以提供很多东西。 这就是我们将在本文中揭示的内容,因为我们将带您体验 Laravel 10 的新功能、修复以及新弃用的方法和包。

Laravel 发布时间表

Laravel 核心团队过去每年发布两个主要版本——每六个月发布一个。

然而,当 Laravel 的创建者 Taylor Otwell 宣布现在每年发布一个主要版本时,发布周期发生了变化。 这使核心团队和社区能够将更多的时间和精力投入到特定版本的框架中,并在不进行任何重大更改的情况下引入新的强大功能。

随着 Laravel 9 于 2022 年 2 月 8 日发布,预计发布时间表如下:

  • Laravel 10 :2023 年 2 月 7 日
  • Laravel 11 :2024 年 2 月 6 日

此外,根据支持政策,所有 Laravel 版本都提供 18 个月的错误修复和两年的安全更新。

以下是预期的错误修复和安全更新计划:

  • Laravel 9 将在 2023 年 8 月 8 日之前继续获得错误修复,并在 2024 年 2 月 6 日之前继续获得安全修复。
  • Laravel 10 将在 2024 年 8 月 6 日之前获得错误修复,并在 2025 年 2 月 4 日之前获得安全修复。
  • Laravel 11 预计将在 2025 年 8 月 4 日之前获得错误修复,并在 2026 年 2 月 2 日之前获得安全修复。

你应该升级到 Laravel 10 吗?

重要的是要记住,我们并不总是需要在新版本发布后立即将应用程序的 Laravel 版本升级到最新版本。

Laravel 是一个开源框架,这意味着每次我们在我们的机器上安装一个新的 Laravel 实例时,我们都拥有该框架的代码库。 这意味着即使我们的应用程序使用的框架版本不再受支持,该应用程序仍然可以运行; 我们只需要自己维护它。

因此,人们普遍建议应用程序稳定性优先于框架升级。

简而言之,在以下情况下你应该考虑升级到 Laravel 10:

  • 该应用程序在其当前版本中稳定且运行没有问题。
  • 新版本要么添加您的应用程序需要的功能,要么修复您的应用程序遇到的问题。
  • 在将升级更改推入生产之前,将对应用程序进行良好测试。

Laravel 10 热更新

Laravel 10 徽标
Laravel 10 徽标的图像。

如您所知,Laravel 10 尚未发布。 但是,我们将使用有关预期版本的所有最新信息来更新这篇文章。 因此,我们建议将此页面加入书签并不时重新访问它。

Laravel 10 的新特性和更新

毫无疑问,任何新版本最令人兴奋的部分是新功能的添加。 因此,事不宜迟,让我们先看看 Laravel 10 中的新功能和更新。

1. PHP 8.1:Laravel 10 的核心

PHP 8.1 是 Laravel 10 最低要求的 PHP 版本。根据 GitHub 上 Laravel 9 分支和框架的 master 分支的对比,一些 PHP 8.1 的特性,比如readonly properties 和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 做好准备。

事实上,包括 Forge、Vapor 和 Envoyer 在内的整个 Laravel 生态系统都支持 PHP 8.2,您甚至可以在 Laravel 9 中使用 PHP 8.2。这有多酷?!

3. Laravel 入门套件升级

一旦发布,Laravel Breeze 和 Jetstream 就可以使用 Laravel 10。 此外,它们也已经升级到 Inertiajs 1,JetStream 还惊喜地提供了完整的暗模式支持。

4. Predis版本升级

Predis 是一个强大的 PHP Redis 客户端,可以帮助您充分利用缓存来提供出色的用户体验。 Laravel 以前支持版本 1 和 2,但是从 Laravel 10 开始,该框架不再支持 Predis 1。

虽然 Laravel 文档提到 Predis 作为与 Redis 交互的包,但您也可以使用官方的 PHP 扩展。 此扩展提供用于与 Redis 服务器通信的 API。

5. 本地类型声明

Laravel 曾经在其框架代码中使用 DocBlocks 来阐明一段代码的作用以及期望的参数或响应类型。 然而,由于 Laravel 10 中的原生类型声明,这将会改变。

解释这种变化的最好方法是用一个简单的例子。 而不是像这样的函数:

 /** * Determine whether the user can create models. * * @param \{{ namespacedUserModel }} $user * @return \Illuminate\Auth\Access\Response|bool */ public function create({{ user }} $user) { // }

……它看起来像这样:

 /** * Determine whether the user can create models. */ public function create({{ user }} $user): bool { // }

此更改纯粹是为了开发人员体验的好处,因为 IDE 将知道预期参数和响应的形状。 当无法通过 PHP 原生类型实现时,它将提供更好的类型清晰度。 因此,它将帮助代码编辑器更好地执行自动完成功能。

6. 所有验证规则默认可调用

如果你要在 Laravel 9 中创建一个可调用的验证规则,你需要在 artisan 命令后添加--invokable标志。 这不再是必需的,因为默认情况下所有 Laravel 10 规则都是可调用的。 因此,您可以运行以下命令在 Laravel 10 中创建一个新的可调用规则:

 php artisan make:rule CustomRule

7.原生列修改支持

为了在使用change()修改列时消除对doctrine/dbal包的需求,Laravel 10 中引入了一项新功能。此功能将允许开发人员使用change()方法并修改 MySQL、PostgreSQL 和SQL Server 无需额外的包。 这是一项重大且有风险的重大更改,但我们认为这是值得的,因为它将消除额外软件包的必要性。

要更好地了解新功能,请参阅以下示例:

 $table->integer('user_balance')->unsigned()->default(0)->comment('balance'); // `user_balance` is an integer, unsigned, defaults to '0', and column comment is 'balance'

现在,我们假设我们有一个user_balance列并且我们想要更改它的类型。 从 Laravel 10 开始,我们可以简单地这样做:

 $table->bigInteger('user_balance')->change(); // This will change `user_balance` to bigInteger instead of just integer

上面的代码将成功更改列的类型,但也会删除UNSIGNEDDEFAULTCOMMENT属性。 因此,重要的是要记住在更改列的类型时添加所有属性:

 $table->bigInteger('user_balance')->unsigned()->default(0)->comment('balance')->change();

如果您有多个数据库连接并且已经安装了doctrine/dbal ,建议在App\Providers\AppServiceProviderboot方法中调用Schema::useNativeSchemaOperationsIfPossible()方法,以便能够使用本机模式操作并使用依赖包之前的原生操作(例如 SQLite,还不支持这个):

 use IlluminateSupportFacadesSchema; class AppServiceProvider extends ServiceProvider { public function boot() { Schema::useNativeSchemaOperationsIfPossible(); } }

8. 列类型原生检索

Laravel 10 的另一个值得注意的特性是能够使用Schema::getColumnType方法,而无需依赖doctrine/dbal包。 我们目前使用Schema::getColumnTypedoctrine/dbal来获取列类型。 doctrine/dbal将每个本机列类型映射到其等价的doctrine/dbal类型,并且它不支持 Laravel 在各种数据库中使用的许多列类型。

另一方面,在 Laravel 10 中,新的Schema::getColumnType方法将返回实际的列类型,而不是它的doctrine/dbal等价物。 它还使您能够为新的本机列修改功能编写集成测试。 您可以使用此功能来获取指定列的数据类型名称或整个类型定义:

 Schema::getColumnType('products', 'price'); // decimal

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() ,我们通常会这样做:

 Order::whereExists(function ($query) { $query->from('products')->whereColumn('products.order_id', 'orders.id'); });

使用 Laravel 10,我们可以这样做:

 Order::whereExists( Product::whereColumn('products.order_id', 'orders.id') );

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 核心团队正在从 Laravel 10 分支中移除 Laravel 9 中弃用的方法。 我们预计团队将在 Laravel 10 发布后立即更新文档的升级指南,以包含所有弃用的方法和包。

如果你打算将当前项目迁移到 Laravel 10,任何使用已弃用方法的代码都应该以新方法重写以实现相同的结果。

以下是我们在将 Laravel 9 与 master 分支进行比较时发现的所有弃用和删除的列表:

  • Route::home方法(在 Laravel 9 中已弃用)
  • dispatchNow周围弃用的函数和方法。 这是为了鼓励开发人员使用dispatchSync ,这是唯一受支持的立即调度方式。
  • getBaseQuery因为它有一个toBase等价物
  • 不再使用的MaintenanceModeException
  • MocksApplicationServices特性
  • 邮件伪造的Mail::failures方法
  • 弃用的$dates属性,建议使用$casts代替
  • assertTimesSent()方法
  • 放弃了对Predis 1 和doctrine/dbal 2 的支持
  • 自 Laravel 放弃对版本 2 的支持以来,在doctrine/dbal中所有相关的弃用

如何安装 Laravel 10

Laravel 10 现已发布,您可以试用并测试其功能。 Laravel 安装程序中的–dev标志从laravel/laravel存储库安装 master 分支。 您所要做的就是在终端中运行此命令:

 laravel new example-kinsta-app --dev

或者,如果您更喜欢使用 Composer:

 composer create-project --prefer-dist laravel/laravel example-kinsta-app dev-master

为了更好地理解 Composer 命令,这里有一个快速解释:

  • laravel/laravel : Laravel 安装包
  • example-kinsta-app :新项目的新目录(可以更改)
  • dev-master :Laravel 的下一个版本(在本例中为 Laravel 10)

安装 Laravel 10 后,您可以通过导航到新目录example-kinsta-app并运行 artisan 命令来确认版本:

 $ php artisan --version Laravel Framework 10.x-dev

如何将项目升级到 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 扩展
  • 卷曲 PHP 扩展
  • DOM PHP 扩展
  • 文件信息 PHP 扩展
  • JSON PHP 扩展
  • Mbstring PHP 扩展
  • OpenSSL PHP 扩展
  • PCRE PHP 扩展
  • PDO PHP 扩展
  • 分词器 PHP 扩展
  • XML PHP 扩展

您可以在几分钟内在 Kinsta 上部署和托管您的 Laravel 10 项目,因为 Laravel 是托管应用程序支持的一长串框架之一。

在 Kinsta 上部署 Laravel 10:分步指南

在 Kinsta 上托管和部署您的应用程序有几个好处,包括不必为部署配置而烦恼。

Kinsta 提供了一个用户友好但功能强大的工具,用于部署应用程序、连接到数据库和监控实时性能。 这个工具被称为 MyKinsta,在本节中,我们将引导您完成使用它部署 Laravel 10 应用程序的步骤。

1. Laravel 10 应用

Laravel 10 应用主页
部署在 Kinsta 上的 Laravel 10 应用程序的主页。

假设你在本地有一个 Laravel 10 应用程序,我们需要确保它有一个可用的 github 存储库。 稍后我们将使用此存储库来部署应用程序。

您可以在应用程序的根目录中包含一个.htaccess文件,其中包含以下内容:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>

对于 Laravel,这会将所有请求重定向到 public/index.php。 但是,如果需要,您可以在添加应用程序时(设置流程步骤)或在应用程序的流程页面上部署后更新此命令。 您可以使用:

  • heroku-php-apache2 /public
  • php artisan serve --host 0.0.0.0 --port 8080

2.登录MyKinsta

MyKinsta 登录页面
MyKinsta 登录页面的屏幕截图。

前往 MyKinsta 登录页面并输入您的电子邮件地址和密码。 如果您还没有帐户,您可以注册一个新帐户并在任何定价计划订阅的第一个月获得 20 美元的折扣。

3.在GitHub上授权Kinsta

登录后,您会注意到仪表板有 3 个选项来创建 WordPress 站点、创建应用程序或创建数据库。 我们将按下连接 GitHub按钮以与 GitHub 集成。

MyKinsta 仪表板
MyKinsta 仪表板的屏幕截图。

接下来,单击继续使用 GitHub按钮。 如果您尚未登录 GitHub,系统会显示登录选项。然后您可以通过选择Authorize Kinsta授权 Kinsta GitHub 应用程序访问您的 GitHub 帐户。

最后,GitHub 会将您的浏览器重定向到 MyKinsta,以便继续设置应用程序。

将 MyKinsta 与 GitHub 连接
连接 MyKinsta 和 GitHub 的屏幕截图。

连接到 GitHub 后,您将看到“添加应用程序”弹出窗口/模式,其中有一个用于选择 GitHub 存储库的下拉菜单。 单击GitHub 存储库字段并在下拉列表中选择编辑 GitHub 权限

将应用程序添加到 MyKinsta
将应用程序添加到 MyKinsta 的屏幕截图。

这将在您的浏览器中打开一个新选项卡到 GitHub 网页,您可以在其中选择 Kinsta 将能够访问的数据。 不要启用对所有存储库的访问,而是考虑仅选择您希望 Kinsta 使用的存储库。 单击Only select repositories ,然后选择您要部署的存储库。

在 GitHub 上安装 MyKinsta
在 GitHub 上安装 MyKinsta 的屏幕截图。

然后,点击Install ,一切就绪!

当您返回 MyKinsta 并单击GitHub 存储库字段时,授权存储库应该是可见的。 此外,您可以勾选提交时自动部署复选框,以启用 MyKinsta 的功能,以便在您对 GitHub 存储库进行任何更改后立即自动部署您的应用程序。

为 MyKinsta 选择存储库分支
为 MyKinsta 选择存储库分支的屏幕截图。

4. 添加应用程序基本信息

您现在可以为应用程序指定一个仅在仪表板中使用的名称,并从 25 个数据中心位置中进行选择,从而允许您将应用程序放置在离用户最近的地理位置。 如果您需要帮助确定哪个数据中心最适合您的应用程序,请查看我们的指南以选择正确的数据中心位置。

添加应用程序基本详细信息
添加应用程序基本详细信息的屏幕截图。

5.添加环境变量

以下部分用于添加环境变量,最重要的变量是APP_KEY

如果您的.env文件中还没有密钥,您可以使用在线 Laravel 密钥生成器生成一个。 然后,在Key 1字段中插入APP_KEY ,在Value 1字段中插入生成的app key。

最后,选择Available during runtimeAvailable during build process

将环境变量添加到 MyKinsta 应用程序
将环境变量添加到 MyKinsta 应用程序的屏幕截图。

5.配置编译环境

这里神奇的是你不需要配置任何东西! 您可以单击“继续”按钮继续,瞧! 您已完成构建环境配置。 但是,如果您想增强构建资源以确保更快的构建,您可以从构建资源字段中选择首选。

构建路径字段是可选的——您可以将其留空,MyKinsta 将使用根文件夹。

MyKinsta 应用程序构建环境
配置应用程序的构建环境。

6.设置流程和付款方式

对于资源部分,使用以下信息填写每个字段:

  • 进程名称:显示在应用程序进程列表中的名称。
  • 流程类型:谨慎选择,因为一旦设置就无法更改。 但是,您可以在部署后在应用程序的进程页面上添加和更改其他进程,例如后台作业。
  • 启动命令:您的进程的“启动”命令(不是必需的)。
  • Pod 大小:您期望您的流程需要的 Pod 容量。
  • 实例数:流程的实例数(最多 50)。

请注意,您可以简单地单击继续而不填写开始命令字段,因为 Kinsta 在第一次部署期间会自动检测所需的命令。

MyKinsta 应用程序设置过程
设置应用程序进程的屏幕截图。

最后一步,查看为您的应用计算的每月使用费用,然后确认您的付款方式。 完成后,单击确认付款方式按钮。

确认 MyKinsta 的付款细节
确认付款详情的屏幕截图。

你完成了! Kinsta 将在后台完成所有工作来为您的应用程序提供服务。

加载应用的部署过程
加载应用程序部署过程的屏幕截图。

然后,您将有权访问所有部署过程的详细信息,以及临时实时应用程序 URL,您稍后可以将其替换为您自己的域。

成功部署应用程序
在 MyKinsta 上成功部署 Laravel10 应用程序。

您的 Laravel 10 应用程序现已在 Kinsta 上运行,但是如果您需要在生产环境中进行更改怎么办? 如果我们想改变锚标签的href属性怎么办? 由于我们激活了提交时自动部署功能,MyKinsta 将检测我们对已部署分支所做的任何更改,并相应地自动更新实时应用程序。

7. 连接 Laravel 10 和 MySQL 数据库

现在我们已经部署了 Laravel 10 应用程序,我们可以毫不费力地构建一个数据库并将其链接到我们的应用程序。 您所要做的就是单击左侧导航菜单中的应用程序,然后单击添加服务并选择数据库

将新数据库添加到 MyKinsta
将新数据库添加到 MyKinsta 的屏幕截图。

填写所有字段后,单击创建数据库。 这将建立一个新的数据库,为内部和外部连接做好准备。 在我们的场景中,我们需要与我们部署的 Laravel 10 项目建立内部连接。

为此,您需要做的就是单击“内部连接”部分中的“添加应用程序”并选择您的应用程序。 您可以选中将环境变量添加到应用程序复选框,MyKinsta 将填写您的应用程序需要的所有.env变量。

将数据库连接到 Laravel 10 应用程序
将数据库连接到 Laravel 10 应用程序的屏幕截图。

就这样,您的 Laravel 10 应用程序已部署并连接到数据库。

如何为 Laravel 10 做贡献

尽管 Laravel 由一个核心团队维护,但它是由超过 3,000 名志愿者贡献者积极开发的。

你想成为这些贡献者之一并帮助塑造 Laravel 的未来吗? 如果您回答是,您可以通过添加新功能、修复错误甚至重写文档中令人困惑的部分来帮助全世界的开发人员。

要为 Laravel 10 做贡献,你需要做的是:

  1. 前往 Laravel 的 GitHub 存储库并查看标题中带有[10.x]标记的拉取请求。 这将为你提供 Laravel 10 的所有拉取请求的清晰画面。如果其中一个 PR 解决了你打算做出的贡献,看看你是否可以改进它。
  2. 如果你计划的贡献还没有被其他人解决,那么你可以自己创建一个 PR。
  3. 并非所有内容都值得添加到框架代码库中。 因此,力求只实现将来易于维护的改进,并能帮助绝大多数 Laravel 社区。
  4. 确保遵守 Laravel 的贡献指南,以便更好地将您的更改与框架合并。

喜欢 Laravel 10 的另一个原因是它可以让你通过寻找漏洞为你的贡献赢钱! 我们接下来会看看那些。

Laravel 10 Bug Hunt 竞赛

Laravel 10 漏洞搜寻竞赛
Laravel 10 漏洞搜寻竞赛。

Laravel 10 宣布了一场精彩的比赛,随机贡献者有机会赢得 1,000 美元。

这将是 Laravel 历史上的第一次此类比赛。 它旨在鼓励社区查找和修补 Laravel 10 中隐藏的错误。

规则很简单:

  • 只有提交到laravel/framework存储库的10.x分支的 PR 才有资格。
  • 只会考虑“真正的”错误修复。 不考虑新功能、重构和拼写错误修复。
  • 每个错误修复都必须得到测试的支持。
  • 接受的错误修复将在 GitHub 上标记,并在比赛结束时随机宣布获胜者。

比赛将在 Laravel 10 的第一个稳定版本发布时结束。 到那时仍未决或在 Laravel 10 发布后提交的任何拉取请求将不合格。

概括

这篇文章不是这样的! 在发布日期之前会有更多更改。 但就目前而言,Laravel 10 似乎非常有前途,我们很高兴介绍它为 PHP 世界带来的所有礼物。

同时,如果您正在寻找更多提高 Laravel 应用程序性能的方法,您可以考虑切换到高级托管服务提供商。 Kinsta 的应用程序托管解决方案是业内最快、最安全和最容易使用的解决方案之一,它们专门为开发人员设计,提供生产流水线和我们经验丰富的开发人员提供的 24/7 专家支持。