你如何通過MoneyType Field驗證表單帖子?如何驗證Symfony表單輸入MoneyType?
這是夠糟糕的it uses input type="text"
instead of type="number"
,但糟糕的是它什麼並不重要的輸入,像「ASDF」的反應總是:valid form posted.
我怎樣才能得到有用的錯誤信息,指示用戶,他們需要把一個有效金額,如「43.21」?
我在控制器試圖'error_bubbling' => true
上添加選項,在樹枝視圖{{ form_errors(form) }}
,並通過$form->getErrors()
作爲this answer建議,但那些總是空的,因爲不管是什麼,$form->isValid()
總是返回true不管用戶輸入。
項目結構:
.
├── composer.json
├── composer.lock
├── pub
│ └── scratch.php
├── vendor
│ └── ...
└── views
└── form.html.twig
scratch.php
<?php require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Translation\Translator;
use Symfony\Bridge\Twig\Form\TwigRenderer;
use Symfony\Bridge\Twig\Form\TwigRendererEngine;
use Symfony\Bridge\Twig\Extension\FormExtension;
use Symfony\Bridge\Twig\Extension\TranslationExtension;
// the Twig file that holds all the default markup for rendering forms
// this file comes with TwigBridge
$defaultFormTheme = 'form_div_layout.html.twig';
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDir = dirname($appVariableReflection->getFileName());
// the path to your other templates
$viewsDir = realpath(__DIR__.'/../views');
$twig = new Twig_Environment(new Twig_Loader_Filesystem(array(
$viewsDir,
$vendorTwigBridgeDir.'/Resources/views/Form',
)));
$formEngine = new TwigRendererEngine(array($defaultFormTheme));
$twig->addExtension(
new FormExtension(new TwigRenderer($formEngine))
);
$twig->addExtension(
new TranslationExtension(new Translator('en'))
);
$formEngine->setEnvironment($twig);
// create your form factory as normal
$formFactory = Forms::createFormFactoryBuilder()
->addExtension(new HttpFoundationExtension())
->getFormFactory();
$formBuilder = $formFactory->createBuilder();
$formBuilder->add("amount", MoneyType::class, [
'currency' => 'USD',
'error_bubbling' => true
]);
$form = $formBuilder->getForm();
$request = Request::createFromGlobals();
$form->handleRequest($request);
if ($form->isValid()) {
die('valid form posted.');
}
$form->getErrors(true);
echo $twig->render('form.html.twig', array(
'form' => $form->createView(),
));
form.html.twig
{{ form_start(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
<input type="submit" />
{{ form_end(form) }}
composer.json
{
"require": {
"symfony/form": "^3.1",
"symfony/twig-bridge": "^3.1",
"symfony/translation": "^3.1",
"symfony/http-foundation": "^3.1"
}
}
什麼是你的 'scratch.php' 文件的目的是什麼?爲什麼不使用控制器文件?我只是問,因爲'scratch.php'文件中有很多代碼似乎不是必需的......並且您也將它放在不是Symfony標準的pub文件夾下。也許你有這樣一個創建項目的原因 - 你能解釋一下嗎? –
@AlvinBunk獨立最小,完整,可驗證的例子。我沒有使用這個框架,用Symfony測試水域,因爲這些組件被認爲是模塊化的。 –
爲什麼不簡單地使用NumberType字段而不是MoneyType作爲用例? – Alsatian