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

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

在疯狂流行的Laravel框架推出十多年后,你有没有想过,”Laravel还能为PHP开发人员提供什么?”

鉴于它已经为初学者和专业开发人员简化了很多PHP开发,有些人甚至会说,它已经把开发人员宠坏了,认为PHP是最简单的编程语言。

那么, Laravel是否还为Laravel开发者准备了更多的惊喜? 或者它已经用尽了所有可能的手段来支持PHP开发者?

嗯, 至少, 我们知道Laravel 10有很多东西可以提供。这就是我们在这篇文章中所要揭示的,我们将带你了解Laravel 10的新功能,修复,以及新淘汰的方法和包。

  1. Laravel发布计划
  2. 你应该升级到Laravel 10吗?
  3. Laravel 10更新热点
  4. 如何安装Laravel 10
  5. 如何升级一个项目到Laravel 10
  6. 如何为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将得到bug修复,直到2024年8月6日和安全修复,直到2025年2月4日。
  • Laravel 11预计在2025年8月4日之前会得到bug修复,在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版本。根据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中的本地类型声明, 这将改变。

解释这一变化的最好方式是用一个简单的例子。取而代之的是一个看起来像这样的函数:

/**
* 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\AppServiceProvider 的 boot 方法中调用 Schema::useNativeSchemaOperationsIfPossible() 方法,以便能够使用本地模式操作,在依赖包之前使用本地操作(例如,SQLite还不支持这个):

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

8. 列类型的本地检索

Laravel 10的另一个值得注意的特点是能够使用 Schema::getColumnType 方法,而不需要依赖 doctrine/dbal 包。目前我们使用 Schema::getColumnType 和 doctrine/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.1PHP 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 仓库的主分支。你所要做的就是在你的终端运行这个命令:

laravel new example-wbolt-app --dev

或者,如果你喜欢使用Composer:

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

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

  • laravel/laravel:用于安装Laravel的软件包
  • example-kinsta-app::你的新项目的新目录(可以改变)
  • dev-master:Laravel的下一个版本(在这个例子中, Laravel 10)

安装Laravel 10后, 你可以通过导航到新目录example-wbolt-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扩展
  • cURL PHP扩展
  • DOM PHP扩展
  • Fileinfo PHP扩展
  • JSON PHP扩展
  • Mbstring PHP扩展
  • OpenSSL PHP扩展
  • PCRE PHP扩展
  • PDO PHP扩展
  • Tokenizer PHP扩展
  • XML PHP扩展

如何为Laravel 10做贡献

虽然Laravel是由一个核心团队维护的, 但它是由超过3000个志愿者贡献者积极开发的.

你想成为这些贡献者中的一员,帮助塑造Laravel的未来吗?如果你的回答是肯定的, 你可以帮助全世界的开发者增加一个新的功能, 修复一个错误, 甚至改写文档中混乱的部分.

要想为Laravel 10做出贡献, 你需要做的是以下几点:

  1. 前往Laravel的GitHub仓库,查看标题中标有 [10.x] 的拉动请求。这将使你清楚地了解Laravel 10的所有拉动请求。如果其中有一个PR是针对你打算做的贡献的, 看看你是否可以改进它.
  2. 如果你计划的贡献还没有被别人解决, 那么你可以自己创建一个PR.
  3. 不是所有的东西都值得添加到框架代码库中。因此, 争取只实现那些在未来容易维护的改进, 并能帮助绝大多数Laravel社区的人.
  4. 确保遵守Laravel的贡献指南,以获得更好的机会让你的修改被合并到框架中。

喜欢Laravel 10的另一个原因是,它允许你通过bug hunts为你的贡献赢得金钱! 我们接下来会看一下这些。

Laravel 10 猎虫大赛

Laravel 10 猎虫大赛

Laravel 10 猎虫大赛

Laravel 10宣布了一个很好的比赛,其中一个随机的贡献者有机会赢得1000美元。

这将是Laravel历史上第一次这样的比赛。它的目的是鼓励社区发现和修补Laravel 10中隐藏的bug。

规则很简单:

  • 只有提交到 laravel/framework 仓库的10.x分支的PR才有资格。
  • 只有 “真正的 “错误修复才会被考虑。新功能, 重构, 和错别字的修复是不被考虑的.
  • 每个错误修复都必须有测试支持。
  • 被接受的错误修复将在GitHub上进行标注,并在比赛结束时随机宣布一个获胜者。

比赛将在Laravel 10的第一个稳定版本发布时结束. 任何拉动请求,如果到那时仍在等待或在Laravel 10发布后提交,将没有资格参加。

小结

这不是这篇文章的全部内容! 直到发布日期,还会有更多的变化。但就目前而言, Laravel 10似乎是非常有前途的, 我们很高兴能介绍它给PHP世界带来的所有礼物.

评论留言