РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
362 of 1361 menu

Правило 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,
    который проверяет, прошла ли форма валидацию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить