Приложение ZF2, которое я в настоящее время разрабатываю, это Apigility, но мне пришлось переместить некоторые настройки InputFilter
из module.config.php
, чтобы разделить InputFilter
файлы/классы.Как обрабатывать случай в приложении Zend Framework 2, когда нужно установить один из нескольких элементов ввода?
Теперь у меня (среди прочих) поля CompanyId
и UserId
. Один (один и только один) из них должен быть установлен. Я пробовал это с помощью валидатора Callback
, см. Ниже. Но это не работает: если оба поля отсутствуют, проверка не выполняется.
Как решить эту проблему?
class AddressPostRequestInput implements ArraySerializableInterface {
...
public function __construct() {
$this->dataSet = [
'CompanyId' => null,
'UserId' => null,
'Type' => null,
];
}
...
public function getInputFilter() {
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
...
$inputFilter->add($factory->createInput(array(
...
$inputFilter->add($factory->createInput(array(
'name' => 'CompanyId',
'required' => false,
'filters' => array(
...
),
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'callback' => function ($value, $context = array()) {
$isValid =
(isset($context['UserId']) && !isset($context['CompanyId'])) ||
(!isset($context['UserId']) && isset($context['CompanyId']))
;
return $isValid;
},
),
),
$inputFilter->add($factory->createInput(array(
'name' => 'UserId',
'required' => false,
'filters' => array(
...
),
'validators' => array(
array(
'name' => 'Callback',
'options' => array(
'callback' => function ($value, $context = array()) {
$isValid =
(isset($context['UserId']) && !isset($context['CompanyId'])) ||
(!isset($context['UserId']) && isset($context['CompanyId']))
;
return $isValid;
},
),
),
)));
$this->inputFilter = $inputFilter;
}
...
}