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

Улучшенные сообщения об ошибках PropertyAccess

Большие сообщения об ошибках необходимы, чтобы избежать разочарования при использовании любого программного обеспечения. В Symfony 4.4 улучшили сообщения об ошибках, генерируемые PropertyAccess, при попытке найти доступное для записи свойство.

Например, когда вы уже определили методы сумматора/удаления, но их подпись была неправильной (например, addFoo()/removeFoo()), это было отображено с ошибкой:

Neither the property "foo" nor one of the methods "addFoo()/removeFoo()",
"setFoo()", "foo()", "__set()" or "__call()" exist and have public access.

Сообщение об ошибке теперь гораздо понятнее:

The method "removeFoo()" requires at least "1" parameter, "0" found.

Это только один пример, но улучшили множество других сообщений об ошибках в этом компоненте.

Поддержка *:only-of-type CSS-селекторы

Компонент CssSelector, который косвенно используется в функциональных тестах для выбора элементов на основе селекторов CSS, поддерживал псевдокласс: only-of-type при указании HTML-элемента (например, p: only-of-type выбирает дочерний элемент, только если он единственный абзац внутри элемента).

В Symfony 4.4 мы также добавили поддержку *:only-of-type (или just:only-of-type), которая выбирает отдельные дочерние элементы. Если элемент имеет 2 <p> и 1 <a> в качестве дочерних, то выбирается только <a>, но если он имеет 1 <p> и 1 <a>, выбираются оба, потому что они единственные в своем типе.

Использование свойства как значения диапазона

Ограничение Range проверяет, что данный номер или объект DateTime находится между некоторым минимумом и максимумом. В Symfony 4.4, благодаря новым параметрам maxPropertyPath и minPropertyPath, вы можете использовать значения, сохраненные в некоторых свойствах, в качестве значений этих минимум/максимум:

// src/Entity/Event.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Event
{
    /**
     * @Assert\Range(
     *      minPropertyPath = "startsAt",
     *      maxPropertyPath = "endsAt"
     * )
     */
    private $registrationDate;

    private $startsAt;
    private $endsAt;

    // ...
}

Сортировать переводов

Команда translation:update поможет вам извлечь переводимое содержимое из шаблонов Twig и контроллеров PHP. В Symfony 4.4 добавили новую опцию --sort для сортировки списка сообщений по алфавиту (asc или desc):

php bin/console translation:update --force --sort=asc fr

Считать пустые строки недействительными

Должна ли пустая строка считаться действительной или недействительной в ограничении длины? Ответ не так очевиден, как может показаться на первый взгляд. В Symfony 4.4 пытались улучшить и упростить это поведение с помощью новой опции allowEmptyString.

В Symfony 4.4 новая опция по умолчанию имеет значение true, чтобы сохранить совместимость с существующим поведением. Однако не рекомендуется явно определять значение для этой опции, поэтому вы увидите несколько журналов устаревания, связанных с этим. Пришлось отказаться от установки этого параметра, чтобы могли изменить значение по умолчанию на false в Symfony 5.0.

Добавлен .gitattributes для удаления тестов

Специальный файл .gitattributes позволяет определять атрибуты для разных путей (каталогов или файлов) в проекте Git (например, изменять символы конца строки или определять, как должен вычисляться diff).

Одним из этих атрибутов является export-ignore, который делает файл или каталог исключаемым при создании архивов Git. Эти архивы используются при установке зависимостей с обновлением composer --prefer-dist (установка их с обновлением composer --prefer-source ничего не исключает).

Учитывая, что компоненты Symfony включают в себя тонну тестовых файлов, и учитывая, что большинству людей тесты не нужны в работе, некоторые из сообщества предложили удалить все тестовые файлы с помощью export-ignore. Эти обсуждения начались в 2014 году и с тех пор стали постоянным спросом. В Symfony 4.4 наконец решили добавить эти файлы .gitattributes.

В результате при установке зависимостей с помощью флага --prefer-dist вы больше не будете получать тесты Symfony, которые могут сэкономить до 50% размера установки (несколько мегабайт на установку). Это поможет вам создавать пакеты меньшего размера при развертывании с помощью Docker или без сервера.