Новое в Symfony 4.4: Разные улучшения (Часть 2)

Исключить ресурсы из конфигурации маршрутизации

При настройке сервисов в Symfony вы можете исключить шаблоны файлов/каталогов, которые не следует превращать в службы. В Symfony 4.4 добавили аналогичную функцию, чтобы вы могли исключить шаблоны из конфигурации маршрутизации:

# config/routes/annotations.yaml
controllers:
    resource: ../../src/Controller/*
    type: annotation
    # annotations won't be loaded for the following patterns
    exclude: '../src/Controller/{DebugEmailController}.php'

Нормализовать пробелы в элементах HTML

В функциональных тестах обычно получают значение узлов HTML и сравнивают его с некоторым ожидаемым значением. При этом Symfony возвращает точное исходное содержимое узла, включая все пробелы и новые строки. Вот почему вы, вероятно, вызываете trim() перед сравнением значений:

$this->assertSame(
    'Hello World',
    trim($crawler->filter('section#content h1.title')->text())
);

Учитывая, что спецификации DOM и WebDriver говорят браузерам всегда возвращать нормализованное содержимое без пробелов, решили сделать то же самое, начиная с Symfony 5.0.

Между тем, в Symfony 4.4 добавили необязательный второй аргумент в метод text(). Если true, содержимое нормализуется. Его значение по умолчанию — false, чтобы сохранить обратную совместимость, но вы увидите сообщение об устаревании, если вы не установите этот аргумент явно, а содержимое содержит пробелы:

$this->assertSame(
    'Hello World',
    $crawler->filter('section#content h1.title')->text(null, true)
);

Поддержка научного формата чисел

Компонент ExpressionLanguage предоставляет богатый синтаксис для создания всевозможных выражений, используемых для служб, безопасности, маршрутизации или для определения ваших собственных бизнес-правил. В Symfony 4.4 улучшили синтаксис с поддержкой экспоненциальной или научной записи чисел (например, 1.99E + 3 или 1e-2).

Устаревшие множественная проверка в isGranted()

Метод isGranted(), предоставленный AuthorizationChecker, позволяет проверить, имеет ли текущий пользователь данное разрешение. Хотя этот метод обычно не используется, он также позволяет передавать более одного разрешения. Например, внутри контроллера, выходящего из Symfony’s AbstractController:

if ($this->isGranted(['ROLE_USER', 'ROLE_ADMIN'])) {
    // ...
}

Какие роли необходимы для пользователя? Оба или только один из них? Ответ… просто любой из них. Тем не менее, это сбивает с толку, и поэтому это стало устаревшим в Symfony 4.4. Начиная с Symfony 5.0, вы можете передать только одно разрешение isGranted(). Если вам нужно проверить несколько разрешений, используйте любую из следующих альтернатив:

if ($this->isGranted('ROLE_USER') || $this->isGranted('ROLE_ADMIN'))) { ... }
if ($this->isGranted('ROLE_USER') && $this->isGranted('ROLE_ADMIN'))) { ... }

if ($this->isGranted(new Expression("is_granted('ROLE_USER') or is_granted('ROLE_ADMIN')"))) { ... }
if ($this->isGranted(new Expression("is_granted('ROLE_USER') and is_granted('ROLE_ADMIN')"))) { ... }

Улучшена команда lint: twig

Команда lint:twig — это одна из команд linter, предоставляемая Symfony для проверки того, что ваше приложение готово к работе. В Symfony 4.4 улучшили его с помощью новой опции — --show-deprecations

$ php bin/console lint:twig --show-deprecations

   ERROR  in symfony-demo/templates/base.html.twig (line 22)

       21 |
     * 22 |           {% block header %}{% spaceless %}
     The "spaceless" tag at line 22 is deprecated since Twig 2.7, use the spaceless filter instead.