Senior Full-Stack Developer in Cancún, México. I build web products with PHP/Laravel, Vue 3, Inertia.js and AWS, and I contribute fixes to the PHP and Laravel open-source ecosystem.
Verifiable boundaries between the modules of a Laravel application, checked in CI.
Folders don't stop the Billing module from reaching into Catalog's models. Cordon Modulith parses your code statically (it never loads or runs it), builds the dependency graph between modules and fails the build when a module:
- uses internal classes of another module instead of its public API,
- depends on a module it did not declare, or
- takes part in a dependency cycle.
It works with nwidart/laravel-modules, InterNACHI/modular or a plain app/Modules folder, supports a baseline for existing projects, and also runs as a Pest expectation, a PHPStan rule and a GitHub Action. php artisan cordon:docs generates Mermaid diagrams of the real architecture.
composer require --dev chrisabner/cordon-modulith
php artisan cordon:verify📖 Documentation · 📦 Packagist · 💻 Repository · Status: 0.2 (alpha)
Merged pull requests:
- doctrine/DoctrineBundle#2324:
find()no longer refreshes managed entities on ORM < 3.7, which ran an extra query and discarded their unflushed changes. - pestphp/pest-plugin-browser#295: scoped container bindings no longer leak between requests in browser tests (it broke Inertia SSR).
- pestphp/pest#2002: PHPUnit extensions can register event subscribers again in
--parallelmode (based on a fix proposed in #1685). - php-debugbar/php-debugbar#1074: no more "Refused to get unsafe header" console errors on cross-origin XHR.
- PromoInvestor: fintech rates comparator for Mexico (Laravel, Laravel Cloud).
🌐 chrisabner.github.io · 💼 LinkedIn


