Архітектурні домовленості («контролери не звертаються до бази напряму», «домен не залежить від HTTP») зазвичай живуть у документації чи головах - і порушуються непомітно. Arch-тести перетворюють їх на тести, що падають при порушенні.
Pest arch():
arch('domain does not depend on the framework layer')
->expect('App\Domain')
->not->toUse(['Illuminate\Http', 'App\Http']);
arch('controllers stay thin')
->expect('App\Http\Controllers')
->not->toUse('Illuminate\Support\Facades\DB');
arch('actions are final and invokable')
->expect('App\Actions')
->toBeFinal()
->toHaveMethod('handle');
arch('no debugging leftovers')
->expect(['dd', 'dump', 'ray', 'var_dump'])
->not->toBeUsed();
Готові пресети:
arch()->preset()->php(); // без застарілих і небезпечних функцій PHP
arch()->preset()->security(); // без eval, exec, unserialize, md5, sha1, rand тощо
arch()->preset()->laravel(); // конвенції Laravel
arch()->preset()->strict(); // строгі типи, final-класи, без protected у final
arch()->preset()->relaxed(); // м'якший варіант
Пресет laravel() перевіряє, наприклад, що класи в App\Models наслідують Model і не мають суфікса Model, а Form Request-и мають метод rules() і суфікс Request. Окремі правила пресету можна виключити через ->ignoring(...).
Що зручно перевіряти:
- напрям залежностей між модулями чи шарами - головне застосування;
- межі модулів:
App\Billingне використовує внутрішні класиApp\Catalog, лише його публічний API; - конвенції: суфікси,
final, інтерфейси для певних каталогів, відсутністьenv()позаconfig/; - заборонені виклики:
dd,DB::rawу певних шарах, прямі HTTP-виклики поза клієнтами.
Чому це цінно:
- правила перевіряються в CI - порушення видно в pull request, а не через рік;
- тести - виконувана документація архітектури;
- нова людина в команді дізнається про правило від тесту, а не з коментаря в рев'ю.
Обмеження: arch-тести бачать статичні залежності (використання класів, функцій). Залежності через рядки, контейнер чи фасади можуть пройти непомітно. Це «запобіжник», а не повна гарантія.
Цей підхід - приклад «функцій придатності» еволюційної архітектури: автоматичних перевірок архітектурних властивостей.