我正在使用CraueFormFlowBundle来创建一个多页面形式,我正在尝试对某些字段进行一些验证,但无法弄清楚如何执行此操作。需要验证的对象不是实体,这会给我带来麻烦。
我尝试在我的表单类型类的getDefaultOption函数中添加一个collectionConstraint,但这不起作用,因为我得到“类型数组的预期参数或Traversable和ArrayAccess”错误。 我尝试在我的对象类中使用注释,但它们似乎没有被考虑在内。如果该类不是实体,是否考虑了注释? (我将enable_annotations设置为true)
无论如何,这样做的正确方法是什么?基本上,我只想验证“年龄”是一个整数......
class PoemDataCollectorFormType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options) {
switch ($options['flowStep']) {
case 6:
$builder->add('msgCategory', 'hidden', array(
));
$builder->add('msgFIB','text', array(
'required' => false,
));
$builder->add('age', 'integer', array(
'required' => false,
));
break;
}
}
public function getDefaultOptions(array $options)
{
$options = parent::getDefaultOptions($options);
$options['flowStep'] = 1;
$options['data_class'] = 'YOP\YourOwnPoetBundle\PoemBuilder\PoemDataCollector';
$options['intention'] = 'my_secret_key';
return $options;
}
}
编辑:添加代码,使用注释处理验证
作为塞浦路斯人,我非常确定使用注释应该有效,但不是...... 我是这样尝试的:
在我的控制器中:
public function collectPoemDataAction() {
$collector = $this->get('yop.poem.datacollector');
$flow = $this->get('yop.form.flow.poemDataCollector');
$flow->bind($collector);
$form = $flow->createForm($collector);
if ($flow->isValid($form)) {
....
}
}
在我的PoemDataCollector类中,这是我的数据类(service yop.poem.datacollector):
class PoemDataCollector
{
/**
* @Assert\Type(type="integer", message="Age should be a number")
*/
private $age;
}
EDIT2:
以下是服务实施: 数据类(PoemDataCollector)似乎链接到流类而不是表单..这就是为什么没有验证?
<service id="yop.poem.datacollector" class="YOP\YourOwnPoetBundle\PoemBuilder\PoemDataCollector">
</service>
<service id="yop.form.poemDataCollector"
class="YOP\YourOwnPoetBundle\Form\Type\PoemDataCollectorFormType">
<tag name="form.type" alias="poemDataCollector" />
</service>
<service id="yop.form.flow.poemDataCollector"
class="YOP\YourOwnPoetBundle\Form\PoemDataCollectorFlow"
parent="craue.form.flow"
scope="request">
<call method="setFormType">
<argument type="service" id="yop.form.poemDataCollector" />
</call>
</service>
如何在尊重craueFormFlowBundle guidelines的同时进行验证?
指南声明:
Validation groups
To validate the form data class a step-based validation group is passed to the form type. By default, if getName() of the form type returns registerUser, such a group is named flow_registerUser_step1 for the first step.
我应该在哪里说明使用这些验证组的约束。?
我试过了:
YOP\YourOwnPoetBundle\PoemBuilder\Form\Type\PoemDataCollectorFormType:
properties:
name:
- MinLength: { limit: 5, message: "Your name must have at least {{ limit }} characters.", groups: [flow_poemDataCollector_step1] }
age:
- Type:
type: integer
message: Please input a number
groups: [flow_poemDataCollector_step6]
但是没有考虑到这一点。
EDIT3:
好的,更好的是,名称验证似乎正在使用:
/**
* @Assert\MinLength(limit=5, groups={"flow_poemDataCollector_step1"}, message="Your name must have at least {{ limit }} characters.")
*/
private $name;
虽然信息没有出现...... 我已将{{form_errors(form.name)}}和{{form_errors(form)}}放入我的模板中......为什么不显示?
可是:
/**
* @Assert\Type(type="integer", groups={"flow_poemDataCollector_step6"}, message="Age should be a number")
*/
private $age;
根本不起作用......
EDIT4:
好吧,我设法让我的验证工作了。但我找不到显示错误信息的方法。他们不应该在使用时显示:
{{ form_errors(form.name) }}
或
{{ form_errors(form) }}
在我的模板中? 在我的情况下,当验证失败时,我返回到我的表单中的相同步骤但没有显示错误消息。此外,$ form-&gt; getErrors()返回一个空数组!如何处理错误?
答案 0 :(得分:0)
我没有对此进行测试,因此我不确定它是否可行,但您可以在buildForm方法中执行以下操作。
$builder->addValidator(new \Symfony\Component\Form\CallbackValidator(function(FormInterface $form) {
$data = $form->getData();
if (!is_int($data['age'])) {
$form->addError(new \Symfony\Component\Form\FormError('Age must be an integer'));
}
}));
答案 1 :(得分:0)
您应该在与表单相关的类中定义约束。该类不必是实体。
应该有效的例子:
// your data class:
use Symfony\Component\Validator\Constraints as Assert;
class DataClass
{
/**
* @Assert\Type(type="integer", message="Age should be an integer")
*/
public $age;
(...)
}
修改强>
此外,您需要将数据类对象传递给表单。例如
$dataClassObject = new DataClass();
$form = $this->createForm(new SomeType(), $dataClassObject); // here is place where you put your data class object into form
$form->bindRequest($request);
// now validation should work
if ($form->isValid()) {
...
答案 2 :(得分:0)
所以这就是发生的事情:我没有渲染与正在验证的表单相同的表单实例...
我使用'form' => $flow->createForm($collector)->createView()
呈现我的网页,将其更改为'form' => $form->createView()
解决了我的问题:现在呈现了错误消息。