Laravel 10.13版本发布

2023-06-01 laravel 版本 发布

本周, Laravel团队发布了v10.13,在语法中加入了数据库转义功能,睡眠测试钩子,响应准备事件,以及更多:

Hash isHashed()方法

Günther Debrauwer贡献了一个isHashed()方法, 封装了本地的password_get_info()调用, 

它可以确定一个字符串是否已经被哈希化:

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

这意味着这个方法可以被模拟,并且没有被锁定在password_get_info()函数的调用上以确定散列。


语法中的逃逸功能

Tobias Petry之前贡献了具有语法特定格式的数据库表达式,现在又在语法类中加入了转义功能:

> 为了解决这个问题,我提出了一个解决方案,
增加对数据库语法的支持,以转义任何值,安全地嵌入到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,以了解这些事件背后的想法的更多细节,如在响应准备期间防止查询,视图渲染等。


发布说明

你可以在GitHub上看到以下完整的新功能和更新列表以及10.12.0和10.13.0之间的差异。

下面的发布说明直接来自更新日志:

https://github.com/laravel/framework/compare/v10.12.0...v10.13.0
https://github.com/laravel/framework/blob/693e0c790ed61f78ac75cb1445df8362f6606a3c/CHANGELOG.md#v10130-2023-05-30


v10.13.0

新增

新增 Illuminate/Hashing/HashManager::isHashed() (#47197)
语法中的逃逸功能(#46558)
在 Illuminate/Support/Sleep.php 中提供测试钩子 (#47228)
为AssertsStatusCodes添加缺失的方法(#47277)
在事件中包裹响应准备 (#47229)

修正了

修正了函数包裹相关工厂定义时的错误 (#47168)
修复了报告和渲染方法之间的不一致(#47201)
修正了Model::isDirty()在AsCollection或AsEncryptedCollection有参数时的问题 (#47235)
修正了JSON_CONTAINS的转义字符串(#47244)
修复了ProcessFailedException异常的输出缺失(#47285)。

已更改

删除无用的else语句(#47186)
RedisStore的改进--除非所有的值都是可序列化的,否则不打开事务(#47193)
使用 carbon::now() 在 takeUntilTimeout lazycollection-method 中获取当前时间戳 (#47200)
合并时避免可见/隐藏的重复(#47264)
在CompilesClasses中添加一个缺失的分号(#47280)
向InvalidPayloadException发送沿用值(#47223)


转:

https://laravel-news.com/laravel-10-13-0

相关文章