Новое в Symfony 6.4: Улучшения DX (часть 2)

Источник: «New in Symfony 6.4: DX Improvements (part 2)»
В Symfony 6.4 добавлено множество функций для улучшения DX (опыта разработчиков): добавление серверных параметров при клике по ссылкам, определение атрибутов краулера по умолчанию и т.д.

Дублирование предпочитаемых вариантов

Параметр preferred_choices поля ChoiceType позволяет отображать определённые варианты в верхней части списка с визуальным разделителем между ними и полным списком вариантов.

Изначально эти предпочтительные варианты отображались только один раз в верхней части списка. В Symfony 4.4, чтобы избежать путаницы у некоторых людей, мы изменили это, и теперь варианты отображаются как в верхней части списка, так и в их первоначальном месте.

Это новое поведение также смущает некоторых людей, поэтому мы добавили новую опцию конфигурации, чтобы вы могли полностью контролировать, должны ли они отображаться дважды или нет:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('language', ChoiceType::class, [
'choices' => [
'PHP' => 'php',
'JavaScript' => 'js',
'Twig' => 'twig',
// ...
],
'preferred_choices' => ['php', 'twig'],
'duplicate_preferred_choices' => true,
]);

Добавление параметров сервера при клике по ссылкам

Компонент BrowserKit имитирует поведение веб-браузера, позволяя вам выполнять запросы, кликать по ссылкам и отправлять формы программным способом. В Symfony 6.4 мы улучшили методы click() и clickLink(), позволяющие задавать настраиваемые параметры сервера, которые добавляются в заголовки запросов при клике на ссылку:

$client = new Client();
$client->request('GET', '/product/123');

$crawler = $client->clickLink('Proceed to Checkout', ['X-Custom-Header' => 'Some data']);

$link = $crawler->selectLink('Proceed to Checkout')->link();
$client->click($link, ['X-Custom-Header' => 'Some data']);

Атрибуты краулера по умолчанию

Компонент DomCrawler облегчает навигацию по DOM для HTML и XML документов. Методы text() и html(), извлекающие text/HTML контент заданного узла, позволяют задать значение по умолчанию. Это полезно, поскольку попытка получить доступ к text/HTML несуществующего узла вызовет исключение:

// Если узел не существует, вызов text() приведёт к исключению
$message = $crawler->filterXPath('//body/p')->text();

// позволяет избежать исключения при передаче аргумента, возвращающего text(), если узел не существует
$message = $crawler->filterXPath('//body/p')->text('Default text content');

В Symfony 6.4 мы улучшили метод attr(), чтобы он также поддерживал значение по умолчанию по тем же причинам, чтобы избежать исключений, когда узел не существует:

// вместо этого...
try {
$value = $dom->filter('a.someclass')->attr('href');
} catch (\InvalidArgumentException $e) {
$value = '';
}

// ...сделайте это
$value = $dom->filter('a.someclass')->attr('href', '');

Максимальное количество повторных попыток в HTTP клиенте

По умолчанию, когда запросы не проходят из-за проблем с сетью или временных ошибок сервера, компонент HttpClient повторяет неудачные запросы до 3 раз, с экспоненциальной задержкой между повторами. В Symfony 6.4 мы улучшаем эту функцию, чтобы вы могли задать точное количество максимальных попыток:

// ...
$client->request('GET', '/foo-bar', [
'max_retries' => 1, // 0 отключение повторных попыток
]);

Обработчик переменных окружения defined

Обработчики переменных окружения преобразуют исходное содержимое данной переменной среды (которая всегда является строкой), превращая его в другие типы данных или изменяя его содержимое.

В Symfony 6.4 мы добавили новый обработчик с названием defined, возвращающий false, если переменная окружения не существует или если она равна null или пустой строке. В противном случае он возвращает true:

parameters:
# ...
is_captcha_enabled: '%env(defined:CLOUDFLARE_TURNSTILE_SITE_KEY)%'

Дополнительные материалы

Предыдущая Статья

Несколько способов упростить CSS в 2023 году

Следующая Статья

Удивительная проблема с Auth user и тестами