Laravel 10.13 发布
发布于 作者 Paul Redmond
本周,Laravel 团队发布了 v10.13,其中包含 Grammar 中的数据库转义功能、休眠测试钩子、响应准备事件等等。
isHashed()
方法
Hash 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 贡献了新的响应事件,用于在准备响应时和准备响应后进入。这允许一些有趣的功能,例如在 PreparingResponse
和 ResponsePrepared
事件之间记录查询。如下所示,如果在 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)