Restful API, используя Slim PHP возвращает пустой, если массив содержит массивы - PullRequest
0 голосов
/ 03 июня 2018

Прежде чем я начну, я хочу сообщить вам, что я действительно нуб в PHP, и это первый API, который я создаю.

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

Я проверил значения переменных в отладке.Это нормально в отладке, и я вижу массив, который содержит несколько вложенных массивов.

Мой код

$app->get('/allfoods', 'authenticate', function () use ($app) {
global $user_id;
$db = new FoodHandler();

// In here i get foods with their details via mysql 
$result = $db->GetAllFoods();
$response = array();
$response["error"] = false;
$response["foods"] = array();

// looping through result and preparing food array
while ($row = $result->fetch_assoc()) {
    $tmp = array();
    $tmp['food_id'] = $row['food_id'];
    $tmp['food_name'] = $row['food_name'];
    $tmp['food_desc'] = $row['food_desc'];
    $tmp['food_category'] = $row['food_category'];
    $tmp['food_creationDate'] = $row['food_creationDate'];
   array_push($response["foods"], $tmp);
}
echoRespnse(200, $response);});

Моя функция вывода (которая прекрасно работает, если в моем массиве нет массива)

function echoRespnse($status_code, $response) {
    $app = \Slim\Slim::getInstance();
    // Http response code
    $app->status($status_code);
    // setting response content type to json
    $app->contentType('application/json');
    echo json_encode($response);
}

$app->run();?>

Каковы мои настройки?

  • Localhost wamp с php 7.2.4
  • Apache 2.4.33
  • Mysql 5.7.21

Я также используюПочтальон, чтобы отправить мой запрос (я тоже пробовал в C#, оба возвращают пустой контент)

1 Ответ

0 голосов
/ 03 июня 2018

Я вижу несколько проблем с вашим кодом.Во-первых, существует проблема с определением вашего маршрута.При определении маршрута вы должны передать два аргумента методу get: шаблон (строка, /allfoods в вашем случае) и экземпляр Clousure (вызываемый, обратный вызов вашего маршрута, анонимная функция в вашемcase.) Подробнее в официальных документах .

Итак, прежде всего, удалите строку authenticate из параметров метода и измените определение маршрута следующим образом:

$app->get('/allfoods', function ($request, $response, $args) {
    // Body of the function goes here
});

Обратите внимание, что я также удалил use ($app), поскольку у вас есть доступ к экземпляру приложения, использующий ключевое слово $this, поэтому в этом нет необходимости ( также описано в официальных документах ).

Второе - это генерация ответа.При использовании Slim Framework всегда лучше возвращать объект $response вместо ответа echo ing ( Подробнее в официальных документах ).Это дает вам некоторые преимущества, например, вспомогательный метод whitJson помогает вам генерировать вывод JSON.

Чтобы уточнить весь код более упрощенным способом:

$app->get('/allfoods', function ($request, $response, $args) {
    global $user_id;
    $db = new FoodHandler();

    // In here i get foods with their details via mysql 
    $result = $db->GetAllFoods();
    $data= array();
    $data["error"] = false;
    $data["foods"] = array();

    // looping through result and preparing food array
    while ($row = $result->fetch_assoc()) {
        $tmp = array();
        $tmp['food_id'] = $row['food_id'];
        $tmp['food_name'] = $row['food_name'];
        $tmp['food_desc'] = $row['food_desc'];
        $tmp['food_category'] = $row['food_category'];
        $tmp['food_creationDate'] = $row['food_creationDate'];
       array_push($data["foods"], $tmp);
    }
// Return JSON data using helper method
return $response->withJson($data);
}

И выбольше не понадобится функция echoResponse.

...