Новое в Symfony 5.1: Улучшения в OptionsResolver

Компонент OptionsResolver помогает настраивать объекты с массивами параметров. В Symfony 5.1 улучшили его с помощью следующих функций.

Fluent Interface

Обычно для каждого параметра настраивается несколько функций (его разрешенные типы, значения по умолчанию, требуется ли он или нет и т. д.). Благодаря новому методу define() вы можете использовать свободный интерфейс для настройки всего, что касается параметра, без повторения его имя в разных методах:

// Before
$resolver->setRequired('host');
$resolver->setDefaults(['host' => 'smtp.example.org']);
$resolver->setAllowedTypes('host', 'string');

// After
$resolver->define('host')
    ->required()
    ->default('smtp.example.org')
    ->allowedTypes('string');

Опция Отладочная информация

Иногда название опции или ее высокодинамичная функция затрудняет понимание сообщений об ошибках, генерируемых Symfony. Вот почему в Symfony 5.1 представили новый метод, который улучшает DX (опыт разработчика), позволяя вам добавить описание/помощь/отладочное сообщение для опции.

Представьте, что вы определяете опцию datetime, значение которой должно быть в будущем:

$resolver->setAllowedValues('scheduledAt', static function ($value): bool {
    return $value >= new \DateTime('now');
});

Это стандартное сообщение об ошибке, отображаемое Symfony в этом случае:

The option "scheduledAt" with value DateTime is invalid.

Однако, если вы добавите методы info() или setInfo():

// using the traditional syntax
$resolver->setInfo('scheduledAt', 'It must be a date in the future.');

// using the fluent interface
$resolver->define('scheduledAt')
    // ...
    ->info('It must be a date in the future.');

Теперь отображается сообщение об ошибке:

The option "scheduledAt" with value DateTime is invalid.
Info: It must be a date in the future.