В тесте функций у меня есть следующее утверждение:
// just a convenience method to post a CSV file
$this->importData($postdata, $csv)
->assertStatus(200)
->assertExactJson([
"alert" => null,
// response text copied from RoomController::import()
"message" => sprintf(__("%d items were created or updated."), count($csv_data)),
]);
Это проходит без проблем в PHP 7.4. Не внося никаких изменений в код своего приложения, я обновился до PHP 8.0, и теперь мне представлены:
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'{"alert":null,"message":"2 items were created or updated."}'
+'{"alert":null,"message":"2 item was created or updated."}'
Рассматриваемый код контроллера выглядит так:
if ($errcount === 0) {
$response_code = 200;
$msg = sprintf(
trans_choice(
"{0}No items were created or updated.|{1}%d item was created or updated.|{2,}%d items were created or updated.",
$count
),
$count
);
} else {
// some other stuff
}
return response()->json(["message" => $msg, "alert" => $alert], $response_code);
Итак, моя проблема в том, что trans_choice
по какой-то причине возвращает единственный элемент в PHP 8.0.
Я не могу найти объяснения, почему это могло происходить. Возвращаясь к PHP 7.4, все снова проходит, поэтому он определенно привязан к версии PHP. Устранение неполадок затруднено, потому что, когда я запускаю artisan tinker
и делаю echo trans_choice("{0}foo|{1}bar|{2,}baz", 3);
, я всегда получаю полосу в результате, независимо от того, использую ли я PHP 7.4 или 8.0.
Локаль не должна входить в это, поскольку я использую необработанные строки, но для записи и locale
, и locale_fallback
в config/app.php
установлены в en.