#json #laravel
#json #laravel
Вопрос:
return Response::json(array('status' => 'Group not found'));
возвращает защищенные данные. Вот JSON:
{"status":"Group not found"}
Следующий код
//$jsonData - the data returned above
var_dump($jsonData);
возвращает это:
объект (Illuminate Http JsonResponse)#320 (10) { [«jsonOptions»:protected]=> int(0) [«data»:protected]=> строка (28) «{«статус»: «Группа не найдена»}» [«обратный вызов»: защищен]=> NULL [«encodingOptions»:protected]=> int(15) [«headers»]=> object(Symfony Component HttpFoundation ResponseHeaderBag)#317 (5) { [«computedCacheControl»:protected]=> array(1) { [«no-cache»]=> bool(true) } [«cookies»: защищено]=> массив (0) { } [«Имена заголовков»: защищено]=> массив (3) { [«cache-control»]=> строка (13) «Cache-Control» [«content-type»]=> строка (12) «Тип содержимого» [«дата»]=> строка (4) «Дата» } [«заголовки»: защищенный]=> массив (3) { [«контроль кэша»]=> массив (1) {[0]=>строка (8) «без кэша» } [«тип содержимого»]=> массив (1) {[0]=> строка (16) «приложение / json» } [«дата»]=> массив (1) {[0]=> строка (29)»Вт, 17 июня 2014 19:03:33 GMT» } } [«CacheControl»: защищенный]=> массив (0) { } } [«содержимое»: защищенный]=> строка (28) «{«статус»:»Группа не найдена»}» [«версия»: защищенный] => строка (3) «1.0» [«StatusCode»: защищенный]=> int(200) [«statusText»: защищенный]=> строка (2) «OK» [«charset»: защищенный] => NULL }
Взгляните на ["data":protected]=> string(28) "{"status":"Group not found"}"
. Данные по какой-то причине защищены и не отображаются при декодировании JSON. Как мне «снять защиту» с него (сделать его общедоступным)?
Комментарии:
1. У меня точно такая же проблема с приложением Laravel, как и у вас. Как сказал мой коллега, фреймворки упрощают и усложняют сложные вещи
2. Столкнувшись с той же проблемой, есть ли у вас какое-либо решение по этому поводу?
Ответ №1:
Я не думаю, что это ваша проблема.
Если вы посмотрите на дерево наследования:
SymfonyComponentHttpFoundationResponse
SymfonyComponentHttpFoundationJsonResponse
IlluminateHttpJsonResponse
Класс ответа-предка имеет:
public function __toString()
{
...
return ... . $this->getContent();
}
Итак, мы следуем:
public function getContent()
{
return $this->content;
}
Это нормально, что ваши данные хранятся внутри member protected $content
, потому что, когда объект JsonResponse преобразуется в строку, PHP использует возвращаемое значение __toString()
метода в качестве строкового представления этого объекта.
Комментарии:
1. Это все еще не объясняет, почему использование
json_encode
вместоResponse::json
работы. Последний скрывает данные подprotected
атрибутом, и я не могу получить к нему доступ позже при декодировании строки JSON с помощьюjson_decode
.2. Я все еще думаю, что это не проблема. Зачем вам нужно json_decode на сервере после того, как вы передали его в Response::json (который должен быть оператором return в конце действия вашего маршрутизатора / контроллера)?
3. json_encode — это функция. он принимает смешанное и возвращаемое значение представляет собой строку, которая является представлением входных данных в формате JSON. Response::json возвращает объект, который вы должны вернуть в качестве возвращаемого значения вашего маршрута / действия. Разница между json_encode и Response::json заключается в различии между деталями реализации функции и объекта ООП.
4. Я разрабатываю API для мобильных устройств. Метод возвращает данные в форме JSON, но иногда я хочу использовать тот же метод для веб-приложения, поэтому мне нужно сначала декодировать данные JSON.
5. Хорошо, хорошо. json_encode предназначен для случаев, когда вы хотите закодировать данные в JSON. Ответ::json(…) предназначен для случаев, когда вы хотите отправить данные клиенту, установить правильные заголовки, закодировать данные в формате JSON, а затем записать их в выходной буфер. Вот ваш ответ. Ваш API должен использовать json_encode, если он не возвращает JSON клиенту браузера… в этом случае следует использовать Response::json