Laravel 10.13 发布

发布于 作者

Laravel 10.13 Released image

本周,Laravel 团队发布了 v10.13,其中包含 Grammar 中的数据库转义功能、休眠测试钩子、响应准备事件等等。

Hash isHashed() 方法

Günther Debrauwer 贡献了 isHashed() 方法,它包装了原生 password_get_info() 调用,用于判断字符串是否已哈希。

Hash::isHashed($value); // bool

这意味着该方法可以被模拟,并且不会锁定到 password_get_info() 函数调用来确定哈希。

Grammar 中的转义功能

Tobias Petry 之前贡献了 带有语法特定格式的数据库表达式,并且正在继续跟进 Grammar 类中的转义功能。

为了解决这个问题,我建议添加对数据库语法的支持,以便将任何值安全地嵌入 SQL 查询中。PHP 通过 PDO::quote 方法在本地提供了这种功能。

各个连接实例(例如 PostgresConnection)实现数据库特定的转义,这意味着您无需使用原始驱动程序特定的查询来转义值。

// Taken from the Postgres escaping tests
$this->assertSame(
"'\\xdead00beef'::bytea",
$this->app['db']->escape(hex2bin('dead00beef'), true)
);
 
$this->assertSame(
'3.14159',
$this->app['db']->escape(3.14159)
);
 
$this->assertSame(
'-3.14159',
$this->app['db']->escape(-3.14159)
);
 
$this->assertSame(
"'Hello''World'",
$this->app['db']->escape("Hello'World")
);

查看 Pull Request #46558 以了解有关这些概念的完整详细信息、实现和讨论。

提供休眠测试钩子

Tim MacDonald 贡献了在测试中休眠时注册一个回调以执行的功能。

// Implementation example from the PR:
$timeout = now()->addMinute();
 
do {
if (Work:attempt()) {
return;
}
 
Sleep::for(100)->milliseconds();
} while (now()->isAfter($timeout));
 
// Test code
$this->freezeTime();
Sleep::fake();
Sleep::whenFakingSleep(fn (Interval $duration) => $this->travel(
$duration->totalMilliseconds
)->milliseconds());
 
// run test code.
 
Sleep::assertSlept();

实际上,我们可以推进 now() 值,以确保我们的实现按预期工作。有关更多详细信息,请查看 Pull Request #47228

其他状态码断言

Volodya Kurshudyan 贡献了一些状态码断言便利方法,它们是直接断言状态码的替代方法。

$response->assertNotModified();
$response->assertTemporaryRedirect();
$response->assertPermanentRedirect();
$response->assertNotAcceptable();

这些便利方法在“是否应该放在框架中”方面存在争议。如果不想使用它们,可以使用 $response->assertStatus(308) 代替 💖

将响应准备包装在事件中

Tim MacDonald 贡献了新的响应事件,用于在准备响应时和准备响应后进入。这允许一些有趣的功能,例如在 PreparingResponseResponsePrepared 事件之间记录查询。如下所示,如果在 PreparingResponse 期间执行了任何查询,您可以抛出异常,或者在生产环境中将它们记录出来。

$logQueries = false;
 
Event::listen(PreparingResponse::class, function () use (&$logQueries) {
$logQueries = true;
});
 
Event::listen(ResponsePrepared::class, function () use (&$logQueries) {
$logQueries = false;
});
 
DB::listen(function (QueryExecuted $event) use (&$logQueries) {
if ($logQueries) {
// log in production, throw locally.
}
});

查看 Pull Request #45603 以了解有关这些事件背后的想法的更多详细信息,例如在响应准备、视图渲染等期间阻止查询。

发行说明

您可以在下面看到完整的新功能和更新列表,以及 10.12.0 和 10.13.0 之间的差异。以下发行说明直接来自 变更日志

v10.13.0

已添加

  • 添加了 Illuminate/Hashing/HashManager::isHashed() (#47197)
  • Grammar 中的转义功能 (#46558)
  • Illuminate/Support/Sleep.php 中提供测试钩子 (#47228)
  • 添加了 AssertsStatusCodes 中缺少的方法 (#47277)
  • 将响应准备包装在事件中 (#47229)

已修复

  • 修复了围绕相关工厂定义的函数包装时的错误 (#47168)
  • 修复了 report 和 render 方法之间不一致的问题 (#47201)
  • 修复了 AsCollection 或 AsEncryptedCollection 有参数时 Model::isDirty() 的问题 (#47235)
  • 修复了 JSON_CONTAINS 的转义字符串 (#47244)
  • 修复了 ProcessFailedException 异常中缺少输出的问题 (#47285)

已更改

  • 删除了无用的 else 语句 (#47186)
  • RedisStore 改进 - 除非所有值都是可序列化的,否则不要打开事务 (#47193)
  • 在 takeUntilTimeout 延迟集合方法中使用 carbon::now() 获取当前时间戳 (#47200)
  • 避免合并时 visible/hidden 中出现重复项 (#47264)
  • 在 CompilesClasses 中添加了一个缺少的分号 (#47280)
  • 将值发送到 InvalidPayloadException (#47223)
Paul Redmond photo

Laravel 新闻的专栏作家。全栈 Web 开发人员和作者。

Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,不错过任何新提示、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现在可以为您雇用 Laravel 项目。⬧ 固定费率为 7,500 美元/月。⬧ 无需冗长的销售流程。⬧ 无需合同。⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel 吗?即时、自动的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 2,500 美元,即可用经验丰富的 Laravel 开发人员(拥有 4-6 年经验)为您的项目增值。获得 160 小时的专业知识和 15 天的免费试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源包,将现代无头电子商务功能的力量带入 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

Laravel 官方工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、现成组件、统计、博客、文档等等。

SaaSykit:Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,助力成功企业。

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成,增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖性输入遮罩库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包向您的 Laravel 应用程序添加评论

阅读文章