我今天发现了JSON Schema,它看起来100%符合我的需求,但它实际上让我疯了一个最基本的案例。在创建这篇文章之前,我显然是尽力遵循现有的文档并在互联网上寻找帮助的东西。
Stack:PHP7 - justinrainbow / json-schema 2.0.5
这是架构:
{
"description":"UserCreate",
"type":"object",
"properties":{
"login":{
"type":"string",
"required":true
},
"idAsc":{
"type":"string",
"required":true
}
},
"required":[
"login",
"idAsc"
]
}
正如你所看到我正在使用所需的定义(布尔和数组),为了确保我使用的是好的,我也尝试了只使用数组和/或布尔结构相同的结果。
这是数据
{
"login":"email@email.com"
}
我期待以下代码检测缺少所需的idAsc参数。
$validator = new JsonSchema\Validator;
$validator->check($data, $schema);
if ($validator->isValid() == false)
echo("Missing something");
else
echo("Good");
但是这段代码继续打印“好”......我肯定错过了一些关于JSON Schema的东西。
感谢您的帮助,最好的问候。
答案 0 :(得分:2)
我终于让它工作了,经过一步一步的调试我正在使用的JSON Schema的实现:
首先,我自己加载了JSON Schema,Github repo中给出的示例看起来对我来说是打破的(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函数中的注释行,如果你使用带有true的json_decode作为第二个参数它也不会工作,那么模式必须是一个对象而不是一个数组!
现在一切都像我的魅力一样;)
致以最诚挚的问候,
答案 1 :(得分:0)
这似乎是您使用的验证器实现的问题。此验证必须失败。您可以尝试其他实现。