- Выпуск свежей версии Laravel 10.13
- Метод хеширования
isHashed()
- Уход от функциональности в рамках класса
Grammar
- Тестирование хаков класса
Sleep
- Дополнительные проверки кода состояния
- Подготовка к реагированию на события
- Примечания к выпуску Laravel 10.13
Выпуск свежей версии Laravel 10.13
Команда Laravel выпустила версию 10.13 с функцией обработки баз данных в Grammar, хуками для тестирования сна, событиями подготовки ответа и многим другим.
Метод хеширования isHashed()
Günther Debrauwer внес метод isHashed()
, который оборачивает встроенный вызов password_get_info()
, определяющий, является ли строка уже хэшированной:
Hash::isHashed($value); // bool
Это означает, что над этим методом можно прикалываться и он больше не привязан к вызову функции password_get_info()
для определения состояния хэширования.
Уход от функциональности в рамках класса Grammar
Tobias Petry представил выражения баз данных с форматированием, определенным грамматикой, и в настоящее время он продолжает эту работу с функцией сопровождения в классе Grammar
:
Для решения этой проблемы я предлагаю решение, которое добавит поддержку для грамматики баз данных для экранирования любого значения для безопасного встраивания в SQL-запросы. PHP обеспечивает это встроенным методом
PDO::quote
.
Экземпляры отдельных соединений (например, PostgresConnection
) реализуют экранирование, специфичное для базы данных, а значит, вам не придется использовать сырые запросы, специфичные в драйверах, для экранирования значений:
// Взято из тестов экранирования Postgres
$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 для получения подробной информации, реализации и обсуждения этих идей.
Тестирование хаков класса Sleep
Tim MacDonald предоставил возможность зарегистрировать обратный вызов для выполнения во время сна при тестировании:
// Пример реализации из PR:
$timeout = now()->addMinute();
do {
if (Work:attempt()) {
return;
}
Sleep::for(100)->milliseconds();
} while (now()->isAfter($timeout));
// Код тестирования
$this->freezeTime();
Sleep::fake();
Sleep::whenFakingSleep(fn (Interval $duration) => $this->travel(
$duration->totalMilliseconds
)->milliseconds());
// запуск тестового кода.
Sleep::assertSlept();
По сути, можно просмотреть значение now()
, чтобы убедиться, что реализуемый функционал работает так, как ожидалось. Более подробную информацию можно найти в Pull Request #47228.
Дополнительные проверки кода состояния.
Volodya Kurshudyan внес несколько удобных функций утверждения кода состояния, которые являются альтернативой прямому утверждению кода состояния:
$response->assertNotModified();
$response->assertTemporaryRedirect();
$response->assertPermanentRedirect();
$response->assertNotAcceptable();
Эти удобные методы могут вызвать споры на тему "должно ли это быть в фреймворке или нет?". Не стесняйтесь не использовать их и используйте $response->assertStatus(308)
вместо этого 💖.
Подготовка к реагированию на события.
Tim MacDonald внес новые события ответа, позволяющие отслеживать момент подготовки и после подготовки ответа. Это позволяет использовать некоторые интересные возможности, такие как регистрация запросов между событиями PreparingResponse
и ResponsePrepared
. Как показано ниже, при выполнении каких-либо запросов во время PreparingResponse
можно выбросить исключение или вывести их из лога в production:
$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) {
// регистрируем в production, выбрасываем локально.
}
});
Более подробную информацию об идеях, лежащих в основе этих событий, можно найти в Pull Request #45603, например, о предотвращении запросов во время подготовки ответа, рендеринга представления и т.д.
Примечания к выпуску Laravel 10.13
Полный список новых функций и обновлений можно посмотреть ниже, а разницу между 10.12.0 и 10.13.0 - на GitHub. Нижеприведенные примечания к выпуску взяты непосредственно из журнала изменений.
Добавления.
- Добавлена функция
Illuminate/Hashing/HashManager::isHashed()
(#47197) - Эскейп функциональности внутри
Grammar
(#46558) - Предоставление хуков для тестирования в
Illuminate/Support/Sleep.php
(#47228) - Добавлены недостающие методы в
AssertsStatusCodes
(#47277) - Обертывание подготовки ответа в событиях (#47229)
Исправления.
- Исправлена ошибка, когда функция оборачивалась вокруг определения связанной фабрики (factory) (#47168)
- Исправлена несогласованность между методами
report
иrender
(#47201) - Исправление
Model::isDirty()
, когдаAsCollection
илиAsEncryptedCollection
имеют аргументы (#47235) - Исправлена экранированная
String
дляJSON_CONTAINS
(#47244) - Исправление отсутствия вывода при исключении
ProcessFailedException
(#47285)
Изменения.
- Удаление бесполезных операторов
else
(#47186) - Улучшение
RedisStore
- не открывать транзакцию, если все значения не являются сериализуемыми (#47193) - Использование
carbon::now()
для получения текущей метки времени в методеlazycollection takeUntilTimeout
(#47200) - Предотвращение дубликатов в
visible
/hidden
при слиянии (#47264) - Добавление отсутствующей точки с запятой в
CompilesClasses
(#47280) - Передача дополнительного значения для
InvalidPayloadException
(#47223)
Перевод с английского официальных новостей Laravel:
https://laravel-news.com/laravel-10-13-0
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)