Правило Luhn
Ограничение Luhn относится к валидаторам Symfony и
вешается на поле формы. Оно проверяет, что введённое
значение проходит алгоритм Луна - контрольную сумму,
используемую для проверки номеров банковских карт.
Правило не проверяет платёжную систему, длину номера
или срок действия карты, а только математическую
корректность последовательности цифр.
Чаще всего Luhn применяют вместе с типом поля
TextType или IntegerType, а также в
комбинации с другими ограничениями, например
NotBlank и Regex.
Синтаксис
#[Luhn(
message: 'The number is invalid.'
)]
Параметр message задаёт текст ошибки, который
показывается пользователю при неудачной проверке.
Пример
Давайте создадим форму с полем для номера карты и
повесим на него ограничение Luhn:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Luhn;
use Symfony\Component\Validator\Constraints\NotBlank;
class CardType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('cardNumber', TextType::class, [
'constraints' => [
new NotBlank(),
new Luhn(
message: 'Некорректный номер карты.'
),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Пример
Давайте создадим контроллер, который выводит форму и проверяет её данные:
<?php
namespace App\Controller;
use App\Form\CardType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class CardController extends AbstractController
{
#[Route('/card', name: 'card_form')]
public function index(Request $request): Response
{
$form = $this->createForm(CardType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
return new Response('card ' . $data['cardNumber']);
}
return $this->render('card/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Теперь создадим Twig-шаблон для вывода формы:
{{ form_start(form) }}
{{ form_row(form.cardNumber) }}
<button type="submit">Send</button>
{{ form_end(form) }}
Пример
Давайте отправим корректный номер карты '4242424242424242':
card 4242424242424242
Если отправить номер '1234567812345678', форма
не пройдёт валидацию и покажет сообщение об ошибке.
Пример
Давайте проверим значение вручную через сервис
ValidatorInterface:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Constraints\Luhn;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class CardCheckController extends AbstractController
{
#[Route('/card/check', name: 'card_check')]
public function index(ValidatorInterface $validator): Response
{
$errors = $validator->validate('4242424242424242', [
new Luhn(),
]);
if (count($errors) === 0) {
return new Response('valid');
}
return new Response('invalid');
}
}
?>
Результат выполнения кода:
valid
Смотрите также
-
ограничение
CardScheme,
которое проверяет платёжную систему карты -
ограничение
Regex,
которое проверяет строку по регулярному выражению -
ограничение
NotBlank,
которое требует непустое значение поля -
метод
isValid,
который проверяет, прошла ли форма валидацию