Я обнаружил, что JSON Schema сегодня на 100% соответствует моим потребностям, но на самом деле это сводит меня с ума в одном из самых простых случаев. Перед созданием этого поста я, очевидно, приложил все усилия, чтобы следовать существующей документации и искал в интернете, пытаясь найти что-то полезное.
Стек: PHP7 — justinrainbow / json-схема 2.0.5
Вот схема:
{
"description":"UserCreate",
"type":"object",
"properties":{
"login":{
"type":"string",
"required":true
},
"idAsc":{
"type":"string",
"required":true
}
},
"required":[
"login",
"idAsc"]
}
Как видите, я использую оба обязательных определения (логическое и массивное), просто чтобы убедиться, что я использую правильное определение, я также попытался использовать только массив и / или логическое значение с тем же результатом.
Вот данные
{
"login":"[email protected]"}
Я ожидаю, что следующий код обнаружит отсутствие обязательного параметра idAsc.
$validator = new JsonSchema\Validator;
$validator->check($data, $schema);
if ($validator->isValid() == false)
echo("Missing something");
else
echo("Good");
Но этот код продолжает печатать «Хорошо»… Я определенно что-то упускаю в JSON Schema.
Спасибо за вашу помощь, с наилучшими пожеланиями.
Я наконец заставил это работать, после отладки шаг за шагом реализация схемы JSON, которую я использовал:
Прежде всего, я сам загрузил схему JSON, пример, приведенный в репозитории Github, выглядит для меня неработоспособным (https://github.com/justinrainbow/json-schema):
$data = json_decode(file_get_contents('data.json'));
// Validate
$validator = new JsonSchema\Validator;
$validator->check($data, (object)['$ref' => 'file://' . realpath('schema.json')]);
Я не смог найти ни одного вызова file_get_contents или родственников внутри библиотеки во время моей пошаговой отладки. По этой причине я решил загрузить схему самостоятельно, а не указывать путь к ней:
function getSchema($filePath) {
// NOT WORKING -> return json_decode(file_get_contents($filePath), true);
return json_decode(file_get_contents($filePath));
}
$data = json_decode($rest->getRequest()->getBody());
$schema = $this->getSchema(realpath('controllers/schemas/userCreate.json'));
$validator = new JsonSchema\Validator;
$check_return = $validator->check($data, $schema);
Обратите внимание на закомментированную строку в функции getSchema, если вы используете json_decode со значением true в качестве второго параметра, это тоже не сработает, схема должна быть объектом, а не массивом!
Теперь все работает как шарм для меня;)
С наилучшими пожеланиями,
Кажется, это проблема используемой вами реализации валидатора. Эта проверка должна провалиться. Вы можете попробовать это с другими реализациями.