Правило Cidr
Правило Cidr проверяет, принадлежит ли значение IP-адреса
заданному диапазону в нотации CIDR. Первым параметром
передаётся версия IP-протокола, вторым - массив разрешённых
диапазонов. Правило вешается на поле формы и при
несоответствии добавляет ошибку валидации.
Синтаксис
#[Cidr(version, ranges)]
Пример
Давайте создадим форму с полем ip и повесим на него
правило Cidr для версии IPv4:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsCidr;
class IpType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('ip', null, [
'constraints' => [
new Cidr([
'version' => 4,
'ranges' => ['192.168.0.0/24', '10.0.0.0/8'],
]),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Пример
Давайте проверим адрес '192.168.0.5' - он должен
успешно пройти валидацию, так как входит в диапазон '192.168.0.0/24':
<?php
namespace AppController;
use AppFormIpType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
class IpController extends AbstractController
{
public function index(Request $request): Response
{
$form = $this->createForm(IpType::class);
$form->submit(['ip' => '192.168.0.5']);
if ($form->isValid()) {
return new Response('valid');
}
return new Response('invalid');
}
}
?>
Результат выполнения кода:
"valid"
Пример
Давайте проверим адрес '8.8.8.8' - он не входит ни в один
из указанных диапазонов, поэтому форма будет невалидной:
<?php
namespace AppController;
use AppFormIpType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
class IpController extends AbstractController
{
public function index(Request $request): Response
{
$form = $this->createForm(IpType::class);
$form->submit(['ip' => '8.8.8.8']);
if ($form->isValid()) {
return new Response('valid');
}
return new Response('invalid');
}
}
?>
Результат выполнения кода:
"invalid"
Пример
Давайте проверим IPv6-адрес '2001:db8::1' с версией
протокола 6 и диапазоном '2001:db8::/32':
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsCidr;
class IpType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('ip', null, [
'constraints' => [
new Cidr([
'version' => 6,
'ranges' => ['2001:db8::/32'],
]),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Результат выполнения кода:
"valid"