я использую ZendFramework 2.4.0. Для примера, давайте предположим, что в моем приложении есть две бизнес-сущности: UserEntity а также CourseEntity. Опять же, для простоты, скажем, между ними есть соотношение 1: 1. Ниже приведено упрощенное определение обоих (методы получения, установки, методы гидратации, пространства имен, использование классов для ясности не включены).
<?php
class UserEntity {
private $name;
private $course;
}
<?php
class CourseEntity {
private $name;
private $difficulty;
}
У меня есть две формы: добавить форму пользователя, добавить форму курса. Я хотел бы использовать AnnotationBuilder с аннотациями в сущностях для наглядности. Я хочу иметь возможность добавлять UserEntity с назначенным курсом, конечно, ввод подлежит проверке. Курс также может отсутствовать. Я должен быть в состоянии POST для «формы создания пользователя» ниже полезной нагрузки:
{
"name":"Joe Doe",
"course":{ // this object is optional
"name":"Beginner guide to coding",
"difficulty":5
}
}
Для этого я добавляю встроенные аннотации к своим объектам Entity, которые теперь выглядят так:
<?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"
Задача ещё не решена.
Других решений пока нет …