• Час читання ~1 хв
  • 20.04.2023

Вступ

Можуть бути випадки, коли ви створюєте свою програму Laravel, що вам потрібно прочитати файл JSON.

Мені часто потрібно це робити, коли я пишу тести для інтеграції API і хочу прочитати фіктивну відповідь, яку я раніше зберіг у файлі JSON. Мені також потрібно було це зробити, коли я працюю зі сторонніми службами (наприклад, Firebase), які надають файл JSON для переходу в SDK для автентифікації.

У цій статті Quickfire ми швидко розглянемо, як використовувати новий 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. Це пов'язано з тим, що функція повернеться, json_decode якщо їй не вдасться null декодувати рядок 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