Проверка объектов с помощью Zend \ Validator

Я пытаюсь использовать Zend\Validator для проверки объектов, но мне трудно по нескольким причинам, и теперь мне интересно, если я делаю что-то в корне неправильно или компонент просто не хороший выбор, чтобы сделать это …

В идеале я бы хотел бежать

$objectValidator = new ObjectValidator();
$objectValidator->isValid($object);

Так что в этом случае я бы поставил (суб) валидаторы для свойств объектов в ObjectValidator«s isValid() метод, например, так:

public function isValid($value, $context = null)
{
$propertyValidator = new Zend\Validator\Callback(function($value) {
return false;
});
if (!$propertyValidator->isValid($value)) {
foreach ($propertyValidator->getMessages() as $code => $message) {
$this->abstractOptions['messages'][$code] = $message;
}
return false;
}

return true;
}

Способ объединения сообщений из валидатора свойства, который я скопировал из компонента EmailAddress валидатор, который возвращается к Hostname валидатор.

Проблема начинается, когда я использую тип валидатора дважды (например, Callback) независимо от того, находятся ли они в одном и том же свойстве или в другом, поскольку сообщения объединяются, и я теряю информацию, которую хотел бы получить. Я мог бы сам создать способ управления сообщениями, но мне интересно, нет ли лучшего решения.

Я тоже думал об использовании Zend\InputFilter вместо создания Zend\Inputs для каждого свойства, для которого я хочу выполнить проверки. Таким образом, я, конечно, получаю все сообщения, но это добавляет довольно раздражающую задачу разборки объекта до того, как я смогу его проверить.

Любой вклад высоко ценится.

0

Решение

Я бы предложил использовать ZF2 InputFilter учебный класс в качестве основы для глубокой проверки объектов и свойств.

Вы можете реализовать Zend\Stdlib\ArraySerializableInterface интерфейс для решения «надоедливая задача по демонтажу объекта» проблема с getArrayCopy метод:

<?php

namespace Application\Model;

use Zend\Stdlib\ArraySerializableInterface;

class MyObject implements ArraySerializableInterface
{

/**
* Exchange internal values from provided array
*
* @param  array $array
* @return void
*/
public function exchangeArray(array $array)
{
//...Your custom logic to exchange properties with data from an array
}

/**
* Return an array representation of the object
*
* @return array
*/
public function getArrayCopy()
{
//...Your custom logic to get array copy of the object for validation
}
}

Или создайте специальный класс для гидраторов, который сделает это за вас …

0

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

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

По вопросам рекламы [email protected]