Symfony2:验证不是实体的对象



我正在使用CraueFormFlowBundle来创建一个多页表单,并试图对一些字段进行验证,但不知道如何做到这一点。需要验证的对象不是实体,这给我带来了麻烦。

我尝试在表单类型类的getDefaultOption函数中添加collectionConstraint,但这不起作用,因为我得到了"类型为array或Traversable and ArrayAccess的预期参数"错误。我尝试在对象类中使用注释,但它们似乎没有被考虑在内。如果类不是实体,是否会考虑注释?(i将enable_anotations设置为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'] = 'YOPYourOwnPoetBundlePoemBuilderPoemDataCollector';
$options['intention'] = 'my_secret_key';
return $options;
}
}

编辑:添加代码,使用注释处理验证

作为Cyprian,我非常确信使用注释应该有效,但它不。。。以下是我的尝试:

在我的控制器中:

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类中,这是我的数据类(服务yop.poem.datacollector):

class PoemDataCollector
{
/**
* @AssertType(type="integer", message="Age should be a number")
*/
private $age;
}

第2版:

以下是服务实现:数据类(PoemDataCollector)似乎链接到流类,而不是表单。这就是没有验证的原因吗?

<service id="yop.poem.datacollector" class="YOPYourOwnPoetBundlePoemBuilderPoemDataCollector">
</service>
<service id="yop.form.poemDataCollector"
class="YOPYourOwnPoetBundleFormTypePoemDataCollectorFormType">
<tag name="form.type" alias="poemDataCollector" />
</service>
<service id="yop.form.flow.poemDataCollector"
class="YOPYourOwnPoetBundleFormPoemDataCollectorFlow"
parent="craue.form.flow"
scope="request">
<call method="setFormType">
<argument type="service" id="yop.form.poemDataCollector" />
</call>
</service>

如何在遵守craueFormFlowBundle指南的情况下进行验证?

指导方针指出:

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.

我应该在哪里说明使用这些验证组的限制。。?

我试过了:

YOPYourOwnPoetBundlePoemBuilderFormTypePoemDataCollectorFormType:
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]

但它没有被考虑在内。

第3版:

好吧,更好的是,名称验证似乎可以使用:

/**
* @AssertMinLength(limit=5, groups={"flow_poemDataCollector_step1"}, message="Your name must have at least {{ limit }} characters.")
*/
private $name;

虽然消息没有出现。。。我已经在模板中放入了{{form_errors(form.name)}}和{。。。为什么它没有显示出来?

但是:

/**
* @AssertType(type="integer", groups={"flow_poemDataCollector_step6"}, message="Age should be a number")
*/
private $age;

根本不起作用。。。

第4版:

好吧,我现在设法让我的验证工作了。。但是我找不到显示错误消息的方法。他们不应该在使用时显示吗:

{{ form_errors(form.name) }}

{{ form_errors(form) }}

在我的模板中?在我的情况下,当验证失败时,我会返回到表单中的相同步骤,但不会显示错误消息。此外,$form->getErrors()返回一个空数组!如何处理错误?

我还没有测试过它,所以我不确定它是否能工作,但您可能可以在buildForm方法中执行以下操作。

$builder->addValidator(new SymfonyComponentFormCallbackValidator(function(FormInterface $form) {
$data = $form->getData();
if (!is_int($data['age'])) {
$form->addError(new SymfonyComponentFormFormError('Age must be an integer'));
}
}));

您应该在与表单相关的类中定义约束。这个类不必是实体。

一个应该有效的例子:

// your data class:
use SymfonyComponentValidatorConstraints as Assert;
class DataClass
{
/**
* @AssertType(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()) { 
...    

所以发生了什么:我没有呈现与正在验证的表单相同的表单实例。。。

我用'form' =>$flow->createForm($collector)->createView()呈现页面,将其更改为'form' =>$form->createView()解决了我的问题:现在呈现错误消息。

相关内容

  • 没有找到相关文章

最新更新