Проверить данные в объекте PHP на соответствие
Пишу приложение авторизации на PHP API (Phalcon). Столкнулся с следующей задачей, при регистрации пользователя на сервере принимаются следующий запрос от клиента:
{
"first_name": "Человек",
"last_name": "Человечище",
"email": "[email protected]",
"password": "12345678"
}
На стороне сервера запрос принимается $data = $this->request->getJsonRawBody(); и создается массив объектов:
stdClass Object
(
[first_name] => Человек
[last_name] => Человечище
[email] => [email protected]
[password] => 12345678
)
Все бы не чего но вот задача, надо чтобы приходящие ключи соответствовали тому что я пропишу и нельзя было нечего левого добавить в запрос.
Если я посылаю запрос, или не добавляю какого-то ключа:
{
"first_name": "Человек",
"last_name": "Человечище",
"email": "[email protected]",
"password": "12345678",
"ЛИШНИЙ КЛЮЧ": "ЛИШНЕЕ ЗНАЧЕНИЕ"
}
То сервер не должен пропустить запрос. Как это можно реализовать?
Спасибо!
Ответы (2 шт):
Заранее создаём массив, где указываем все "подабающие" ключи. Так называемый "белый список".
['first_name', 'last_name, 'email', 'password']
затем из принятого массива берём ключи array_keys
Затем сравниваем два массива через array_diff. Если есть разница - значит что-то не то.
Очень много людей плюются и гадят сторону PHP, но всё-же решений из коробки там более чем достаточно. Ответ на твою задачу лежит в intersect функциях
<?php
$values = [
"first_name" => "Человек",
"last_name" => "Человечище",
"email" => "[email protected]",
"password" => "12345678",
"ЛИШНИЙ КЛЮЧ" => "ЛИШНЕЕ ЗНАЧЕНИЕ"
];
$validator = [
"first_name" => 1,
"last_name" => 1,
"password" => 1,
"email" => 1,
];
$res = array_intersect_key($values, $validator);
print_r($res);
Результат выполнения, выявленные ключи из 2го массива, разрешены к значениям первого. Какие значения у 2го массива, без разницы.
Array
(
[first_name] => Человек
[last_name] => Человечище
[email] => [email protected]
[password] => 12345678
)