Правило Timezone
Правило Timezone относится к группе
ограничений валидации Symfony и вешается
на поле формы или свойство сущности. Оно
проверяет, что переданное значение является
допустимым идентификатором часового пояса,
например 'Europe/Moscow' или 'UTC'.
Правило можно использовать как в виде атрибута,
так и в виде ограничения в конфигурации формы.
Синтаксис
#[Timezone]
Также правило можно подключать через
Constraints в опциях поля формы:
'constraints' => [
new Timezone(),
],
Пример
Давайте создадим сущность с полем timezone
и повесим на него правило Timezone:
<?php
namespace AppEntity;
use SymfonyComponentValidatorConstraints as Assert;
class Article
{
#[AssertTimezone]
private string $timezone = '';
public function getTimezone(): string
{
return $this->timezone;
}
public function setTimezone(string $timezone): void
{
$this->timezone = $timezone;
}
}
?>
Теперь проверим валидацию с корректным значением:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidatorValidatorInterface;
class ArticleController extends AbstractController
{
public function index(ValidatorInterface $validator): Response
{
$article = new Article();
$article->setTimezone('Europe/Moscow');
$errors = $validator->validate($article);
if (count($errors) > 0) {
return new Response((string) $errors);
}
return new Response('valid');
}
}
?>
Результат выполнения кода:
"valid"
Пример
Давайте передадим некорректный часовой пояс и посмотрим на сообщение об ошибке:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentValidatorValidatorValidatorInterface;
class ArticleController extends AbstractController
{
public function index(ValidatorInterface $validator): Response
{
$article = new Article();
$article->setTimezone('abcde');
$errors = $validator->validate($article);
return new Response((string) $errors);
}
}
?>
Результат выполнения кода:
"Object(AppEntityArticle).timezone: This value is not a valid timezone."
Пример
Давайте применим правило Timezone
непосредственно в форме через опцию
constraints:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsTimezone;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('timezone', TextType::class, [
'constraints' => [
new Timezone(),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Теперь обработаем отправку формы в контроллере:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(Request $request): Response
{
$form = $this->createForm(ArticleType::class, null, [
'csrf_protection' => false,
]);
$form->submit([
'timezone' => 'Europe/Moscow',
]);
if ($form->isValid()) {
return new Response('valid');
}
return new Response((string) $form->getErrors(true));
}
}
?>
Результат выполнения кода:
"valid"
Смотрите также
-
поле
TimezoneType,
которое создаёт выпадающий список часовых поясов -
поле
Date,
которое проверяет корректность даты -
поле
DateTime,
которое проверяет корректность даты и времени -
поле
Time,
которое проверяет корректность времени