• Время чтения ~1 мин
  • 20.04.2023

Введение

При сборке приложения 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», в которой более подробно рассматриваются аналогичные темы.

Если вы заинтересованы в том, чтобы получать обновления каждый раз, когда я публикую новый пост, не стесняйтесь подписаться на мою рассылку ниже.

Продолжайте создавать потрясающие вещи! 🚀

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297