ZF2表单带有可选的compositionObject - 验证

时间:2015-05-04 14:48:47

标签: php forms validation zend-framework2 annotations

背景

我正在使用 ZendFramework 2.4.0 。为了举例,我们假设我的应用中有两个业务实体: UserEntity CourseEntity 。同样,为简单起见,我们可以说它们之间存在1:1的关系。下面是两者的简化定义(getter,setter,hydration方法,名称空间,类的使用都是为了清晰起见)。

<?php
class UserEntity {
    private $name;

    private $course;
}
<?php
class CourseEntity {
    private $name;

    private $difficulty;
}

我有两种形式:添加用户表单,添加课程表单。为了清晰起见,我想在实体中使用 AnnotationBuilder 和注释。我希望能够在分配的课程中添加UserEntity,当然输入需要经过验证。课程也可能缺失。我应该能够在有效负载下面发布“用户创建表单”:

{  
   "name":"Joe Doe",
   "course":{  // this object is optional
      "name":"Beginner guide to coding",
      "difficulty":5
   }
}

为实现这一点,我在实体对象中添加了内联注释,现在看起来像:

<?php
/**
 * @Annotation\Name("user")
 * @Annotation\Instance("UserEntity")
 */
class UserEntity {
    /**
     * @Annotation\Required(true)
     */
    private $id;

    /**
     * @Annotation\Required(false)
     * @Annotation\AllowEmpty()
     * @Annotation\ComposedObject("CourseEntity")
     */
    private $course;
}
<?php
/**
 * @Annotation\Name("course")
 * @Annotation\Instance("CourseEntity")
 */
class CourseEntity {
    /**
     * @Annotation\Required(true)
     */
    private $name;

    /**
     * @Annotation\Required(false)
     */
    private $difficulty;
}

我的表单如下:

<?php
$payload = json_decode($data); // payload like the one above
$form = (new AnnotationBuilder())->createForm('UserEntity');
$form->setData($payload);

if ($form->isValid()) {
    echo 'Valid !';
} else {
    var_dump(Json::encode($form->getMessages()));
}

问题

我无法正确验证课程对象。有三种可能性:

  1. 用户实体有效,课程存在且有效 - 正确行为
  2. 用户实体有效,课程存在且无效 - CORRECT BEHAVIOR - 验证错误
  3. 用户实体有效,课程缺席 - 表格可以验证CourseEntity。
  4. 场景#3存在问题。我希望 CourseEntity 不会被验证,因为必需(错误) AllowEmpty() ComposedObject 注释。

    调试构建的表单时,似乎不考虑required和allowEmpty选项。我在这做错了吗?

    额外考虑

    有趣的是,当我将 UserEntity.course 字段上的注释顺序切换为

    /**
     * @Annotation\ComposedObject("CourseEntity")
     * @Annotation\Required(false)
     * @Annotation\AllowEmpty()
     */
    private $course;
    

    然后AnnotationBuilder无法构建具有异常的表单:

    Zend\InputFilter\Factory::createInput expects an array or Traversable; received "boolean"
    

0 个答案:

没有答案