Форма ZF2 с необязательным составным объектом — проверка

я использую 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()));
}

Я не могу получить объект курса для правильной проверки. Есть три варианта:

  1. Пользовательский объект действителен, курс присутствует и действителен — ПРАВИЛЬНОЕ ПОВЕДЕНИЕ
  2. Пользовательский объект действителен, курс присутствует и недействителен — ПРАВИЛЬНОЕ ПОВЕДЕНИЕ — ошибка проверки
  3. Пользовательский объект действителен, курс отсутствует — ФОРМА ПЫТАЕТСЯ ПРОВЕРЯТЬ CourseEntity.

Сценарий № 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"

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector