首页 文章

Symfony2:验证不是实体的对象

提问于
浏览
1

我正在使用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-> getErrors()返回一个空数组!如何处理错误?

3 回答

  • 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'));
            }
        }));
    
  • 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;
    
        (...)
    }
    

    edit:

    此外,您需要将数据类对象传递给表单 . 例如 .

    $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()) { 
        ...
    
  • 0

    所以这就是发生的事情:我没有渲染与正在验证的表单相同的表单实例...

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

相关问题