我正在尝试验证我在 .twig 文件中创建的表单。我不是使用createFormBuilder
创建表单。这是我的控制器代码,在提交表单之后调用视图2的两个案例 1)。
public function cart_newAction(Request $request)
{
$entity = new Product();
$errors = '';
if ($request->getMethod() == 'POST')
{
$validator = $this->get('validator');
$errors = $validator->validate($entity);
if (count($errors) > 0) {
echo 'Error';
}
else {
echo 'Success';
}
}
return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
}
这是视图文件,我显示的是这样的错误
的 Add.html.twig
{% for error in errors %}
{{error}}
{% endfor %}
我在validation.yml文件中设置了不能为空的名称的错误。 所以现在当我运行视图页面时,它每次都会在我提交表单后显示错误。 如果没有错误,则不应显示错误,只显示空白错误。
Note:
有没有更好的方法可以做到这一点所以请分享一下。记住我在没有createFormBuilder
的情况下这样做
的更新
它总是显示Error.Even如果我的表单有效并且没有遗漏任何字段。
答案 0 :(得分:1)
如果您想自己制作表单,则无法使用Syfmony表单验证器对其进行验证。您需要使用简单的PHP验证服务器端。像这样的东西
if ($request->getMethod() == 'POST')
{
$username = $_POST['username'];
if ($username == '')
{
// set error message here
}
}
答案 1 :(得分:1)
好,让我说清楚。我要给您两个解决方案,第一个是最好,最正确的方法:
1)生成您的EntityForm类型:bin/console make:form
或d:g:form
命令。
2)然后只需添加几行即可提交并获取错误。
public function cart_newAction(Request $request)
{
$entity = new Product();
$form = $this->createForm(EntityType::class, $entity);
$form->submitForm($request->request->all(), false);
if ($request->getMethod()->isPost())
{
if ($form->isValid()) {
echo 'Error';
}
else {
echo 'Success';
}
}
return $this->render('CartCartBundle:Cart:Add.html.twig', [
'errors' => $form->getErrors(),
]);
}
第二种解决方案是将数据绑定到实体对象,因为我们需要将数据设置到对象中。
1)第一步,在当前类中创建一个private
功能,以绑定所有提交的数据:
private function bindEntityValues(Product $entity, array $data) {
foreach ($data as $key => $value){
$funcName = 'set'+ucwords($key);
if(method_exists($entity, $funcName)) $entity->$funcName($value);
}
}
然后您的cart_newAction应该是这样的:
public function cart_newAction(Request $request)
{
$entity = new Product();
$this->bindEntityValues(entity, $request->request->all());
$errors= $this->get('validator')->validate($entity)
if (count($errors) > 0) {
echo 'Error';
}
else {
echo 'Success';
}
}
return $this->render('CartCartBundle:Cart:Add.html.twig', ['errors' => $errors]);
}
希望这有助于您有一个清晰的视野。
答案 2 :(得分:0)
您必须检查$errors
是否为空:
if (count($errors) > 0) {
return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
} else {
return $this->render('CartCartBundle:Cart:Add.html.twig');
}
请参阅文档here。