hen*_*nit 5 forms validation constraints symfony silex
我有一个Silex项目,我使用FormServiceProvider和ValidatorServiceProvider.我使用form.factory构建器创建了一个表单,添加了字段,并使用对象作为数据集:
$form = $app['form.factory']->createBuilder('form', $object)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在"正常方式"上验证表格:
if ($app['request']->getMethod() == 'POST') {
$form->bind($app['request']);
if ($form->isValid()) {
(...)
}
}
Run Code Online (Sandbox Code Playgroud)
在对象中,我添加了一个loadValidatorMetadata静态方法:
static public function loadValidatorMetadata(ClassMetadata $metadata) {
$metadata->addPropertyConstraint('name', new Assert\MinLength(5, array('message' => 'Name too short')));
}
Run Code Online (Sandbox Code Playgroud)
当我使用较短的名称字段提交表单时,isValid仍然返回true.如果我在对象上运行一个validate方法,如下所示:
$errors = $app['validator']->validate($object)
Run Code Online (Sandbox Code Playgroud)
它根据约束返回错误,但表单isValid未找到此错误.当我查看symfony Form类时,我发现当disable config为true时,isValid会跳过检查子字段.这是我的表格的情况,但我不知道为什么.我刚刚以正常方式注册了Silex服务提供商,没有任何特殊配置.知道如何根据对象约束使表单失败验证吗?
以下内容在我的 Silex 设置中似乎运行良好。也许您只需要调用该$form->handleRequest()
方法?
控制器
$app->match('/form', function (Request $request) use ($app) {
$object = new \My\Namespaced\Entity\Object();
$form = $app['form.factory']->createBuilder('form', $object)
->add('name')
->add('submit', 'submit')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$app['session']->getFlashBag()->add('success', 'Success flash message');
}
else {
$app['session']->getFlashBag()->add('danger', 'Error flash message');
}
return new Response($app['twig']->render('form.html.twig', array(
'form' => $form->createView(),
)));
})->bind('form');
Run Code Online (Sandbox Code Playgroud)
项目等级
<?php
namespace My\Namespaced\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;
class Object
{
private $name;
static public function loadValidatorMetadata(ClassMetadata $metadata) {
$metadata->addPropertyConstraint('name', new Assert\Length(array(
'min' => 5,
'minMessage' => 'Name too short',
)))
->addPropertyConstraint('name', new Assert\NotBlank(array(
'message' => 'Name is required field.'
)));
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function getName()
{
return $this->name;
}
}
Run Code Online (Sandbox Code Playgroud)
树枝模板
{% extends 'layout.html.twig' %}
{% block content %}
{{ form(form, {action: path('form'), attr:{ 'novalidate': 'novalidate' }}) }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
779 次 |
最近记录: |