Обновление: так как у меня нет ответов, я переписал весь пост, используя гораздо более простой пример. Надеюсь, это поможет выявить проблему.
У меня проблемы с проверкой формы. Я могу заставить утверждение NotBlank () работать, но Type () не работает для меня. Во-первых, вот код:
/* ...\Entity\LineItem.php */ <?php namespace Rialto\ExperimentBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; class LineItem { /** * @var integer * @Assert\NotBlank() * @Assert\Type(type="integer") */ private $quantity = 0; public function getQuantity() { return $this->quantity; } public function setQuantity($quantity) { $this->quantity = $quantity; } } /* ...\Controller\DefaultController.php */ <?php namespace Rialto\ExperimentBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; use Rialto\ExperimentBundle\Entity\LineItem; 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. Может ли кто-нибудь увидеть, что я сделал неправильно?
Спасибо, – Ян
Причина, по которой это не работает, как и ожидалось, объясняется ошибкой в реализации заглушки Symfony в NumberFormatter. Реализация stub будет использоваться, если у вас нет встроенного расширения PHP.
В принципе, числоформат числа пытается проанализировать значение и возвращает false, когда обнаруживает, что он начинается с нечислового символа . Он должен установить код ошибки, который затем инициирует исключение в трансформаторе, но, поскольку он этого не делает, используется логическое значение false и получает typecast для целого числа (что само по себе является ошибкой). Таким образом, ваш «adsf» вход заканчивается как целое число 0 и передает утверждение типа.
Я нашел отчет об ошибке, и я отправил запросы на загрузку против него для двух ошибок.
Вы можете использовать эти исправления, чтобы исправить проблему, или вы могли бы обойти ее сейчас, добавив утверждение Min с лимитом, установленным в 1.
Может быть, вы должны изменить это:
$this->isPost( $request )
Для этого:
$request->isPost()
Это просто предположение … Но я надеюсь, что это поможет!