Тестове завдання на Laravel для імпорту товарів з файлів Excel/CSV у базу даних. Передбачено:
- веб-інтерфейс завантаження за адресою /price-import;
- перевірку та пропуск дублікатів (за назвою та кодом моделі);
- автоматичне створення рубрик та категорій за даними з файлу;
- пакетну обробку великих файлів та коротку статистику після імпорту.
- PHP 8.2+
- Composer 2+
- MySQL/MariaDB (локально зручно через XAMPP)
- Розширення PHP: zip, xml, mbstring (потрібні для роботи з Excel)
Бібліотека для імпорту: maatwebsite/excel (PhpSpreadsheet).
- Клонувати репозиторій
- Відкрийте PowerShell у теці D:\xampp\htdocs
- Виконайте: git clone https://github.com/vitkonovaluck/test_import_excel_in_laravel test_import_excel_in_laravel
- Перейти в теку проєкту: cd D:\xampp\htdocs\test_import_excel_in_laravel
- Встановити залежності: composer install
- Створити файл налаштувань: copy .env.example .env
- Згенерувати APP_KEY: php artisan key:generate
- Створити БД у phpMyAdmin (наприклад, excel_import) і вказати доступи в .env:
- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=excel_import
- DB_USERNAME=root
- DB_PASSWORD=
- Виконати міграції: php artisan migrate
- Запустити локальний сервер: php artisan serve
- Відкрити у браузері: http://127.0.0.1:8000/price-import
За потреби, якщо запускаєте через Apache XAMPP, налаштуйте VirtualHost або відкрийте http://localhost/test_import_excel_in_laravel/price-import
Обмеження на розмір завантаження визначаються PHP директивами upload_max_filesize, post_max_size та memory_limit. На сторінці імпорту відображається динамічно розрахований ліміт на основі цих значень (див. App\Rules\MaxFileSize). За замовчуванням правило не дозволяє завантажувати файл більший, ніж найменше з цих значень (для memory_limit використовується чверть значення).
Якщо потрібно збільшити ліміт, змініть значення у php.ini (XAMPP: D:\xampp\php\php.ini) і перезапустіть Apache:
- upload_max_filesize=64M
- post_max_size=64M
- memory_limit=512M
- Перейдіть на сторінку імпорту: /price-import
- Виберіть файл .xlsx/.xls/.csv у полі "Виберіть Excel файл"
- Натисніть "Імпортувати"
- Після завершення побачите підсумкове повідомлення із статистикою:
- скільки записів імпортовано/пропущено;
- загальна кількість оброблених рядків;
- час виконання та швидкість обробки;
- список перших 10 помилок (якщо вони виникли).
Маршрути:
- GET /price-import — форма завантаження
- POST /price-import — обробка імпорту
Важливо:
- Назва товару (col 4) та Код моделі (col 5) — обовʼязкові. Рядки без них пропускаються.
- Дублікати в межах одного файлу та записи, що вже існують у БД, пропускаються.
- Рубрики/категорії створюються автоматично. Якщо рубрики відсутні, використовується "Без рубрики".
Таблиця products (створюється міграцією) містить поля:
- category_id (звʼязок із categories)
- name, description, manufacturer
- model_code (унікальний)
- price (decimal 10,2)
- warranty, availability (boolean)
Також використовуються таблиці rubrics і categories для ієрархії рубрик/категорій.
- Імпорт здійснюється пакетами по 1500 записів (batchSize).
- Читання Excel відбувається чанками по 3000 рядків (chunkSize).
- Для зменшення витрат памʼяті використовується кешування існуючих значень і збір сміття.