Класс OptionsResolver
Класс OptionsResolver используется для управления
массивами параметров (опций). Он позволяет задать
значения по умолчанию, обязательные и необязательные
параметры, разрешённые типы и значения, а также
нормализовать данные перед использованием.
Синтаксис
$resolver = new OptionsResolver();
$resolver->setDefaults(array $defaults);
$resolver->setRequired(array $required);
$resolver->setDefined(array $defined);
$resolver->setAllowedTypes(string $option, string|array $types);
$resolver->setAllowedValues(string $option, array|Closure $values);
$resolver->setNormalizer(string $option, Closure $normalizer);
$options = $resolver->resolve(array $options);
Пример
Давайте создадим простой резолвер с параметром по умолчанию:
<?php
namespace AppService;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleService
{
public function getArticle(array $options = []): string
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'title' => 'hello',
'limit' => 10,
]);
$options = $resolver->resolve($options);
return $options['title'] . ' ' . $options['limit'];
}
}
?>
Результат выполнения кода с пустым массивом опций:
"hello 10"
Пример
Давайте сделаем параметр title обязательным:
<?php
namespace AppService;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleService
{
public function getArticle(array $options = []): string
{
$resolver = new OptionsResolver();
$resolver->setRequired(['title']);
$resolver->setDefaults([
'limit' => 10,
]);
$options = $resolver->resolve($options);
return $options['title'] . ' ' . $options['limit'];
}
}
?>
Результат выполнения кода при передаче только
title:
"abcde 10"
Если не передать обязательный параметр, будет
выброшено исключение MissingOptionsException.
Пример
Давайте ограничим допустимые типы для параметра
limit:
<?php
namespace AppService;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleService
{
public function getArticle(array $options = []): int
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'limit' => 10,
]);
$resolver->setAllowedTypes('limit', 'integer');
$options = $resolver->resolve($options);
return $options['limit'];
}
}
?>
Результат выполнения кода при передаче корректного значения:
5
Если передать строку вместо числа, будет выброшено
исключение InvalidTypeException.
Пример
Давайте ограничим допустимые значения для параметра
status:
<?php
namespace AppService;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleService
{
public function getArticle(array $options = []): string
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'status' => 'draft',
]);
$resolver->setAllowedValues('status', ['draft', 'published', 'archived']);
$options = $resolver->resolve($options);
return $options['status'];
}
}
?>
Результат выполнения кода при передаче корректного значения:
"published"
Если передать недопустимое значение, будет выброшено
исключение InvalidOptionsException.
Пример
Давайте добавим нормализатор для параметра
title, который будет приводить строку
к нижнему регистру:
<?php
namespace AppService;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleService
{
public function getArticle(array $options = []): string
{
$resolver = new OptionsResolver();
$resolver->setDefaults([
'title' => 'hello',
]);
$resolver->setNormalizer('title', function ($options, $value) {
return strtolower($value);
});
$options = $resolver->resolve($options);
return $options['title'];
}
}
?>
Результат выполнения кода при передаче
'ABCDE':
"abcde"
Смотрите также
-
метод
setDefaults,
который задаёт значения по умолчанию -
метод
setRequired,
который делает параметры обязательными -
метод
setAllowedTypes,
который ограничивает типы значений -
метод
resolve,
который возвращает итоговый массив опций