Php Symfony2:验证不是实体的对象

Php Symfony2:验证不是实体的对象,php,validation,symfony,craueformflow,Php,Validation,Symfony,Craueformflow,我正在使用CraueFormFlowBundle创建一个多页表单,并尝试对一些字段进行验证,但不知道如何进行验证。需要验证的对象不是实体,这给我带来了麻烦 我尝试在表单类型类的getDefaultOption函数中添加collectionConstraint,但这不起作用,因为我得到了类型为array或Traversable and ArrayAccess error的预期参数。 我尝试在我的对象类中使用注释,但它们似乎没有被考虑。如果类不是实体,是否考虑注释?我将enable_annotati

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

我尝试在表单类型类的getDefaultOption函数中添加collectionConstraint,但这不起作用,因为我得到了类型为array或Traversable and ArrayAccess error的预期参数。 我尝试在我的对象类中使用注释,但它们似乎没有被考虑。如果类不是实体,是否考虑注释?我将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类中,这是我的数据类服务yop.poem.datacollector:

class PoemDataCollector
{
     /**
     * @Assert\Type(type="integer", message="Age should be a number")
     */

    private $age;
}
编辑2:

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

    <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>
我应该在哪里声明使用这些验证组的约束

我试过:

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]
但它并没有被考虑在内

编辑3:

好的,更好的是,对名称的验证似乎是通过以下方式进行的:

/**
 * @Assert\MinLength(limit=5, groups={"flow_poemDataCollector_step1"}, message="Your name must have at least {{ limit }} characters.")
 */
private $name;
虽然消息没有出现。。。 我已将{{form\u errorsform.name}和{{{form\u errorsform}}放在我的模板中。。。为什么不显示

但是:

根本不起作用

编辑4:

好吧,我现在已经开始验证了。。但是我找不到显示错误消息的方法。使用时不应该显示:

{{ form_errors(form.name) }}

在我的模板中?
在我的例子中,当验证失败时,我返回表单中的同一步骤,但没有显示错误消息。此外,$form->getErrors返回一个空数组!如何处理错误?

我还没有测试过这个,所以我不确定它是否有效,但是您可以在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'));
        }
    }));

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

一个应该有效的例子:

// 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()) { 
    ...    

下面是发生的情况:我没有呈现与正在验证的表单相同的表单实例


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

是的,我尝试了这个,并且非常确定它应该可以工作!但是它不。。。我用更多的代码编辑了我的问题,以展示我是如何做到这一点的。由于我看不到您的服务实现,我发布了一些更抽象的示例。总而言之,我想问题在于您没有将数据类对象传递给表单。我将使用服务实现编辑我的帖子。我正在使用这个CraueFormFlowBundle,所以我必须遵循他们在控制器中的指导原则..链接在我的帖子中他们正在讨论基于步骤的验证,但我不理解它是如何工作的,也找不到示例…1类PoemDataCollector不应该是一个服务,因为它是一个资源--这是您的数据类。2是否确实指定了正确的组名:flow\u PoemData Collector\u step6?注意名字后面的六个。在我的理解中,这个约束应该只在第六步起作用,对吗?这是您的意图吗?1我替换了$collector=$this->get'yop.poem.datacollector';使用$collector=new PoemDataCollector;。我必须将该服务保留在services.xml中,因为其他服务使用该服务作为参数。2是,此约束应在步骤6中应用。我仍然想知道为什么MaxLength和MinLength约束有效,而不是Type约束。此外,仍然无法显示消息。
    $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'));
        }
    }));
// 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()) { 
    ...