Я пытаюсь использовать 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\Input
s для каждого свойства, для которого я хочу выполнить проверки. Таким образом, я, конечно, получаю все сообщения, но это добавляет довольно раздражающую задачу разборки объекта до того, как я смогу его проверить.
Любой вклад высоко ценится.
Я бы предложил использовать 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
}
}
Или создайте специальный класс для гидраторов, который сделает это за вас …
Других решений пока нет …