我正在使用 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()));
}
我无法正确验证课程对象。有三种可能性:
场景#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"