#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'
. Кроме того, код внутри этого блока выполняется (как и должно быть), так что я не думаю, что это проблема.