Проверка Symfony2 с использованием аннотации Assert не работает

#php #validation #symfony

#php #проверка #symfony

Вопрос:

Обновление: поскольку я не получаю никаких ответов, я переписал весь пост, используя гораздо более простой пример. Надеюсь, это поможет выявить проблему.

У меня возникли проблемы с проверкой формы. Я могу заставить работать утверждение NotBlank(), но Type() у меня не работает. Во-первых, вот код:

 /* ...EntityLineItem.php */
<?php

namespace RialtoExperimentBundleEntity;

use SymfonyComponentValidatorConstraints as Assert;

class LineItem
{
    /**
     * @var integer
     * @AssertNotBlank()
     * @AssertType(type="integer")
     */
    private $quantity = 0;

    public function getQuantity()
    {
        return $this->quantity;
    }

    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;
    }
}

/* ...ControllerDefaultController.php */
<?php

namespace RialtoExperimentBundleController;

use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationResponse;

use RialtoExperimentBundleEntityLineItem;


class DefaultController extends Controller
{
    public function indexAction()
    {
        return $this->testValidation();
    }

    private function testValidation()
    {
        $item = new LineItem();

        $form = $this->createFormBuilder($item)
            ->add('quantity', 'integer')
            ->getForm();

        $request = $this->getRequest();
        if ( $request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ( $form->isValid() ) {
                return new Response('Form is valid.');
            }
        }

        return $this->render('RialtoCoreBundle:Form:basicForm.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}
  

Когда я оставляю ввод пустым, я получаю сообщение об ошибке, как и ожидалось. Но когда я ввожу «adsf» во ввод, я вижу вывод «Форма действительна». Я пробовал то же самое, используя проверку YAML и PHP. Кто-нибудь может увидеть, что я сделал не так?

Спасибо, — Ян

Ответ №1:

Причина, по которой это работает не так, как ожидалось, заключается в ошибке в реализации-заглушке Symfony NumberFormatter. Реализация заглушки будет использоваться, если у вас не установлено расширение PHP intl.

По сути, программа форматирования чисел пытается проанализировать значение и возвращает false, когда обнаруживает, что оно начинается с нечислового символа. Он должен установить код ошибки, который затем вызовет исключение в transformer, но, поскольку этого не происходит, используется логическое значение false, которое преобразуется в целое число (что само по себе тоже является ошибкой). Итак, ваш ввод «adsf» заканчивается как целое число 0 и передает утверждение типа.

Я нашел сообщение о проблеме по этому поводу и отправил запросы на извлечение для двух ошибок.

Вы можете использовать эти исправления, чтобы исправить проблему, или вы можете обойти ее сейчас, добавив минимальное утверждение с установленным пределом в 1.

Комментарии:

1. Отличный ответ! Спасибо за ссылки, особенно на отчет об ошибке.

Ответ №2:

Возможно, вам следует изменить это:

 $this->isPost( $request )
  

Для этого:

 $request->isPost()
  

Это всего лишь предположение..Но я надеюсь, что это поможет!

Комментарии:

1. Я забыл упомянуть, что $this->isPost($request) это метод, который я написал. Это эквивалентно высказыванию $request->getMethod() == 'POST' . Кроме того, код внутри этого блока выполняется (как и должно быть), так что я не думаю, что это проблема.