Вышла новая версия Laravel 10.13
Laravel 10.13 — новая версия популярного PHP-фреймворка


Выпуск свежей версии 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

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню