Правило Locale
Правило Locale относится к группе ограничений
валидации формы. Оно вешается на поле формы и проверяет,
что введённое значение является допустимым кодом локали
(например, 'ru', 'en', 'fr_FR').
Правило принимает значение null или массив
дополнительных параметров через именованные аргументы.
Синтаксис
new Locale()
Пример
Давайте создадим форму с полем locale
и навесим на него правило Locale:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentFormExtensionValidatorConstraintsLocale;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeTextType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('locale', TextType::class, [
'constraints' => [
new Locale(),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Теперь создадим контроллер, который обрабатывает форму и выводит результат валидации:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_form')]
public function index(Request $request): Response
{
$form = $this->createForm(ArticleType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return new Response('form is valid');
}
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Создадим Twig-шаблон для вывода формы:
{{ form_start(form) }}
{{ form_row(form.locale) }}
<button type="submit">Send</button>
{{ form_end(form) }}
Результат выполнения кода при отправке значения 'ru':
"form is valid"
Пример
Давайте отправим некорректное значение 'xyz'
и получим ошибку валидации:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_form')]
public function index(Request $request): Response
{
$form = $this->createForm(ArticleType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return new Response('form is valid');
}
if ($form->isSubmitted()) {
$errors = $form->get('locale')->getErrors();
return new Response($errors[0]->getMessage());
}
return $this->render('article/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода при отправке значения 'xyz':
"This value is not a valid locale."
Пример
Давайте используем правило Locale вместе
с сущностью и другими ограничениями:
<?php
namespace AppEntity;
use SymfonyComponentValidatorConstraintsLocale;
use SymfonyComponentValidatorConstraintsNotBlank;
class Article
{
#[NotBlank]
#[Locale]
private string $locale = '';
public function getLocale(): string
{
return $this->locale;
}
public function setLocale(string $locale): void
{
$this->locale = $locale;
}
}
?>
Создадим форму для этой сущности:
<?php
namespace AppForm;
use AppEntityArticle;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeTextType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('locale', TextType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Article::class,
]);
}
}
?>
Результат выполнения кода при отправке значения 'fr_FR':
"form is valid"