Введение
При сборке приложения Laravel могут быть случаи, когда вам нужно прочитать файл JSON.
Мне часто приходилось это делать, когда я пишу тесты для интеграции API, и я хочу прочитать фиктивный ответ, который я ранее сохранил в файле JSON. Мне также нужно было сделать это, когда я работал со сторонними сервисами (такими как Firebase), которые предоставляют файл JSON, который вы можете передать в SDK для аутентификации.
В этой статье мы быстро расскажем, как использовать новый File::json
метод, который был добавлен в Laravel 10.4 Остином Уайтом в PR #46481. Мы также расскажем, как использовать аналогичный Storage::json
метод, который был добавлен в Laravel 10.5 lorenzolosa в PR #46548.
Затем мы быстро сравним различия между этими двумя методами и способы улучшения обработки ошибок.
Чтение файлов JSON с помощью фасада
«Файл» Метод File::json
представляет собой простую оболочку вокруг json_decode
функции и File::get
метода. Он позволяет считывать JSON-файл из локальной файловой системы и возвращать содержимое в виде массива.
Раньше, если вы хотели прочитать файл JSON в своем приложении Laravel, вы могли сделать что-то вроде этого:
$contents = File::get(base_path('path/to/file.json'));
$json = json_decode($contents);
Предполагая, что файл JSON действителен, переменная $json
теперь будет массивом, содержащим содержимое файла JSON.
Например, предположим, что JSON-файл содержит следующие данные:Переменная теперь будет содержать следующие данные массива:Мы $json
можем добиться точно такого же поведения, используя новый File::json
метод, например:
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
]
}
[
'name' => 'laravel/laravel',
'type' => 'project',
'description' => 'The Laravel Framework.',
'keywords' => [
'framework',
'laravel',
],
]
$json = File::json(base_path('path/to/file.json'));
Хотя это небольшое изменение, мне оно очень нравится!
Я большой поклонник попыток сделать так, чтобы мой код читался как можно ближе к простому английскому языку, и я чувствую, что этот метод помогает в этом. Всякий раз, когда я пишу какой-либо код, я пытаюсь думать про себя: «Сможет ли младший, присоединившийся к команде, понять, что происходит?».
Конечно, это небольшое изменение не сделает ваш код волшебным образом читаемым для всех, но я думаю, что именно такие небольшие изменения со временем дадут вам предельную выгоду.
Чтение файлов JSON с помощью фасада «хранилище
» Подобно методуFile::json
, Laravel также имеет Storage::json
метод, который можно использовать для чтения файлов JSON.
В то время как этот File::json
метод можно использовать для чтения файлов JSON из любого места в локальной файловой системе, его Storage::json
можно использовать для чтения файлов с диска хранения приложения. В результате это означает, что вы можете использовать Storage::json
для чтения файлов из корзины AWS S3, Digital Ocean Spaces и т. д.
Метод можно вызвать точно так же, как и методFile::json
:Ошибка обработки
$json = Storage::json('path/to/file.json');
различных поведений для несуществующих файлов
На момент написания этой статьи важно отметить, что File::json
и Storage::json
имеют немного другое поведение, когда дело доходит до работы с несуществующими файлами.
Если вы попытаетесь прочитать несуществующий файл с помощью этого File::json
метода, он вызовет исключениеIlluminate\Contracts\Filesystem\FileNotFoundException
. Однако, если вы попытаетесь прочитать несуществующий файл с помощью методаStorage::json
, он вернет null
.
Это то, что вам нужно помнить при использовании этих методов и выборе наилучшего подхода к обработке ошибок.
Чтение недопустимых файлов
JSON Вы всегда должны помнить о проверке содержимого JSON-файла, прежде чем пытаться его использовать.
Допустим, у вас есть следующий недопустимый JSON-файл (с запятой в конце предпоследней строки, вызывающей ошибку):
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
}
Если вы попытаетесь использовать Storage::json
или File::json
прочитать этот файл, оба этих метода вернут null
. Это связано с тем, что функция вернетсяnull
, json_decode
если она не сможет декодировать строку JSON.
Это связано с тем, что базовый json_decode
метод использует 0
(JSON_ERROR_NONE
) в качестве флага по умолчанию, что означает, что он автоматически завершит сбой, если столкнется с ошибкой.
Как правило, я предпочитаю создавать исключение, если есть ошибка, чтобы я был вынужден ее обрабатывать. Это гарантирует, что я не буду использовать недопустимые данные в своем приложении, и может предупредить меня о моем программном обеспечении для отслеживания ошибок, чтобы я мог решить проблему. Для этого вы можете передать JSON_THROW_ON_ERROR
флаг методам следующим образом:
$json = Storage::json('path/to/file.json', JSON_THROW_ON_ERROR);
$json = File::json('path/to/file.json', JSON_THROW_ON_ERROR);
Теперь, если какой-либо из этих методов не может декодировать строку JSON, будет выброшен aJsonException
.
Заключение
Надеюсь, эта статья Quickfire должна была дать вам краткое представление о том, как вы можете использовать новые File::json
методы чтения Storage::json
файлов JSON в Laravel.
Если вам понравилось читать этот пост, я хотел бы услышать об этом. Точно так же, если у вас есть какие-либо отзывы для улучшения будущих, я также хотел бы это услышать.
Вам также может быть интересно ознакомиться с моей 220+ страничной электронной книгой «Battle Ready Laravel», в которой более подробно рассматриваются аналогичные темы.
Если вы заинтересованы в том, чтобы получать обновления каждый раз, когда я публикую новый пост, не стесняйтесь подписаться на мою рассылку ниже.
Продолжайте создавать потрясающие вещи! 🚀