Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 22 вересня 2026

Difflock: Лінтинг Laravel-міграцій та перевірка схеми бази даних

Difflock - це Laravel-пакет від Rati Rukhadze, призначений для перевірки міграцій відносно бази даних, яку вони змінюватимуть. Він читає вихідний код міграції без її завантаження чи виконання, а потім використовує поточну схему та метадані про розмір таблиць, щоб позначити зміни, які потребують уважнішого огляду перед розгортанням.

Основні можливості Difflock

Пакет включає наступний функціонал:

  • Лінтинг міграцій для виявлення деструктивних операцій, змін колонок, індексів, зовнішніх ключів та чутливих назв колонок
  • Базові знімки схеми, збережені у форматі JSON, які дозволяють порівнювати базу даних із збереженим знімком або іншим підключенням
  • Захист міграцій, що виконує перевірки перед передачею контролю команді migrate Laravel
  • Перевірки для CI з кодами виходу для ризикованих міграцій, відхилень схеми та помилок конфігурації
  • Інструменти MCP для перевірки таблиці, файлу міграції або вихідного коду міграції, утримуваного в контексті агента

Перевірка міграцій, що очікують виконання

Команда difflock:lint за замовчуванням аналізує міграції, які очікують на виконання. Міграція, подібна до наведеної нижче, може виглядати звичайно у pull request:

Schema::table('orders', function (Blueprint $table) {
    $table->string('channel');
    $table->foreignId('customer_id')->constrained()->cascadeOnDelete();
    $table->string('card_number', 32)->nullable();
    $table->index('status');
});
Schema::table('customers', function (Blueprint $table) {
    $table->dropColumn('legacy_token');
    $table->renameColumn('name', 'full_name');
});

На заповненій базі даних Difflock може позначити колонку channel без значення за замовчуванням (non-null), деструктивний виклик dropColumn() та перейменування колонки. Він також повідомляє, що cascadeOnDelete() видаляє дочірні рядки безпосередньо в базі даних, що обходить події моделей, спостерігачів та м'яке видалення.

Пакет має правила для змін, які статичні перевірки порожньої тестової бази даних можуть пропустити. Правило change-column порівнює виклик ->change() з поточним визначенням колонки. unindexed-foreign-key перевіряє, чи додає рушій бази даних індекс, необхідний для зовнішнього ключа. redundant-index повідомляє про певний випадок префіксу, наприклад, додавання індексу на (status), коли (status, created_at) вже існує.

Варіанти використання команди

Використовуйте прапорець -v для розгорнутого відображення результатів або --rule= для фокусування на одному правилі:

php artisan difflock:lint
php artisan difflock:lint -v
php artisan difflock:lint --rule=drop-column

Коли у додатку немає міграцій, що очікують виконання, команда перевіряє всі файли міграцій замість того, щоб видавати порожній звіт. Існуючі проекти можуть прийняти свій поточний беклог за допомогою php artisan difflock:lint --all --accept, а потім використовувати отриманий файл database/difflock/accepted.json як базовий для нових знахідок.

Відстеження відхилень схеми

Difflock записує спостережувану схему замість відновлення очікуваної схеми з файлів міграцій. Це дозволяє уникнути спроб інтерпретації міграцій, що містять умовні конструкції, цикли або сирий SQL.

php artisan difflock:diff --save

Ця команда записує файл database/difflock/schema.json, який можна зберегти у системі контролю версій. Пізніше команда php artisan difflock:diff порівнює поточне підключення з цим файлом. Ви також можете порівняти два налаштованих підключення:

php artisan difflock:diff --from=staging --to=production

Базовий знімок містить структуру схеми, включаючи таблиці, колонки, індекси, значення за замовчуванням та зовнішні ключі. Він не включає рядки таблиць або облікові дані. Налаштування snapshot.defaults, snapshot.comments та ignore.tables дозволяють обмежити те, що записується.

Захист міграцій та інтеграція з CI

Встановлення Difflock не змінює поведінку команди php artisan migrate. Пакет захищає міграції лише коли ви використовуєте його власну команду:

php artisan difflock:migrate

Вона спочатку аналізує міграції, що очікують виконання. Коли знахідки досягають налаштованого рівня блокування, вона зупиняється до того, як Laravel почне запис у базу даних. Прапорець --allow-risky навмисно обходить захист Difflock, тоді як прапорець --force Laravel залишається окремим прапорцем для підтвердження на продакшені.

Використання в CI/CD

Для CI запускайте перевірку відхилень та лінтинг міграцій разом:

run: php artisan difflock:check --ci

Команда завершується з кодом 0, коли перевірка пройшла успішно, 1 - для відхилень або знахідок на налаштованому порозі, та 2 - коли перевірку неможливо виконати. Вона все ще може аналізувати правила, що стосуються лише вихідного коду, без підключення до бази даних, але повідомляє, що дані таблиці були недоступні.

Підтримка MCP

Команда php artisan difflock:mcp запускає автономний MCP-сервер через stdio. Його чотири інструменти надають контекст таблиці, лінтинг міграцій, перевірки відхилень схеми та документацію правил.

Інструмент міграції приймає або шлях до файлу, або текст вихідного коду. AI-агент кодування може перевірити міграцію перед записом файлу, використовуючи поточну схему бази даних та статистику таблиць. Пакет також включає команду difflock:explain, яка створює Markdown-брифінг для міграції без виклику мовної моделі чи будь-якого зовнішнього API.

Встановлення та налаштування

Difflock 1.0.0 потребує PHP 8.3 і підтримує Laravel 12 та 13. Він працює з MySQL, MariaDB, PostgreSQL та SQLite.

composer require heyosseus/difflock --dev
php artisan vendor:publish --tag=difflock-config
php artisan difflock:doctor

Команда difflock:doctor виводить інформацію про підключення, доступні таблиці, міграції, що очікують виконання, зареєстровані правила та чи може налаштована роль бази даних виконувати запис. Роль лише для читання є розумним вибором, коли ви хочете, щоб Difflock перевіряв продакшн-підключення.

Difflock доступний на GitHub.

33

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Новини 09 листопада 2026

Laravel Herd 2.0: Herd Studio, workspaces і автоматичний dev-сервер

Herd 2.0 для macOS і Windows додав Herd Studio - панель у браузері для роботи з coding-агентами поруч із сайтом .test, ізольовані workspaces на окремих гілках і піддоменах та автоматичний запуск php artisan dev. Усе AI вимикається, а базовий Herd лишається безкоштовним.

Новини 09 листопада 2026

Вразливості в PHPUnit 13.4 і symfony/yaml: що оновити в Laravel-проєкті

PHPUnit 13.4.0-13.4.3 виконував код PHPT-тестів зі спільного каталогу /tmp/phpunit-phpt, який міг підмінити інший користувач машини. Виправлення - 13.4.4, а користувачам Pest 5 треба оновити сам Pest до 5.3.4. Заразом - нагадування про DoS у symfony/yaml, виправлений у 5.4.54, 6.4.45, 7.4.18 і 8.1.6.

Вакансії за темою

JATAPP Нова
Вчора

Middle+ Full Stack Developer (Vue.js + PHP/Laravel)

Full Stack розробник у мультипродуктовий юніт: відповідатиме за бекенд на PHP (Laravel/Symfony) для мобільних застосунків і фронтенд веб-продуктів на Vue.js. Завдання включають розробку й підтримку API, інтеграцію third-party сервісів і черг (RabbitMQ), платіжних, маркетингових та аналітичних систем, а також відповідальність за релізи, моніторинг і стабільність продукту. Головні вимоги: комерційний досвід з PHP та Laravel або Symfony, досвід із Vue.js (або React з готовністю швидко освоїти Vue),

Full-Stack Developer (Laravel, React/Angular)

Розробник full-stack для розробки нових функцій і підтримки існуючого функціоналу в командах проєктів. Основний стек: Laravel і PHP (від 2 років), React або Angular (від 2 років комерційного досвіду), MySQL, REST API, JavaScript, HTML/CSS. Потрібні добре знання ООП, патернів проєктування, орієнтація на якість коду; бажаний досвід розподілених систем або високонавантажених проєктів.

Full Stack Developer (PHP / React) Middle / Middle+

Full Stack розробник розвиватиме та підтримуватиме власний аналітичний продукт для перевірки контрагентів і оцінки ризиків, працюючи зі складною бізнес-логікою та великими обсягами даних. Основний стек: PHP 8.x, Laravel або Symfony, MySQL, React; також потрібні проєктування API, оптимізація SQL-запитів, Docker, CI/CD. Вимоги: комерційний досвід від 3 років, досвід підтримки legacy-коду, англійська B1+ для читання документації.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

28,335 v2.5.1 13 28

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,782 15.37.7 12