ແບ່ງລະບົບໃຫ້ທີມເຮັດວຽກງ່າຍ.
ແບ່ງຕາມຂອບເຂດທຸລະກິດ ເຊັ່ນ Catalog, Sales, Billing — ແລະເຊື່ອມກັນຜ່ານ contract.
Dependency ທີ່ອ່ານເຫັນໄດ້
Sales ໃຊ້ Catalog ຈຶ່ງລະບຸ Catalog ໃນ dependencies. Framework ກວດຊື່ຊ້ຳ, dependency ທີ່ຂາດ ແລະວົງຈອນ A → B → A ກ່ອນເອີ້ນ lifecycle hooks. ລຳດັບໃນ config ບໍ່ຈຳເປັນຕ້ອງຈັດ dependency ກ່ອນ; ລຳດັບຂອງ module ທີ່ບໍ່ຂຶ້ນກັນຈະອີງຕາມ config.
return [
new \Icom\Modules\Definition('Sales',
\App\Modules\Sales\SalesModule::class, ['Catalog']),
new \Icom\Modules\Definition('Catalog',
\App\Modules\Catalog\CatalogModule::class),
];
// php bin/icom modules:list → Catalog, then SalesLifecycle ສອງຂັ້ນ
register(Container) ໃຊ້ລົງທະບຽນ service factories. ຫຼັງຈາກ register ທຸກ module ແລ້ວ ຈຶ່ງເອີ້ນ boot(Application) ເພື່ອເພີ່ມ routes. Provider ຕ້ອງ implement Icom\Modules\Module ແລະສ້າງໄດ້ໂດຍບໍ່ຕ້ອງສົ່ງ constructor arguments. Lifecycle ເຮັດໄດ້ຄັ້ງດຽວຕໍ່ Application. ຖ້າ boot ລົ້ມເຫຼວ ຕ້ອງຖິ້ມ instance ນັ້ນ; ມັນຈະບໍ່ຮັບ request ຕໍ່.
Service scope ແລະການຊ້ຳຂອງ binding
ໃຊ້ scoped ສຳລັບ services ທີ່ຜູກກັບ request ຫຼື PDO. bindOnce ປະຕິເສດ binding ທີ່ລົງທະບຽນແລ້ວ; bind ຍັງເປັນວິທີປ່ຽນ binding ໂດຍຕັ້ງໃຈ. ຢ່າເກັບ user, tenant ຫຼື request ໃນ singleton/static. Modules ບໍ່ໄດ້ເພີ່ມຂອບເຂດ process ໃໝ່: ທຸກ module ແມ່ນ code ທີ່ເຊື່ອຖືໄດ້ໃນ application ດຽວ.
Nested route groups
Prefix ຂອງ path ແລະ name ຈະຕໍ່ກັນ. Middleware ເຮັດວຽກຈາກ group ຊັ້ນນອກ → ຊັ້ນໃນ → route. ຕ້ອງຂຽນ route path ໃຫ້ເລີ່ມດ້ວຍ /. ຕົວຢ່າງ / ພາຍໃຕ້ /api ຈະໄດ້ /api/; trailing slash ຍັງມີຄວາມໝາຍ.
$app->group('/api/v1', static function ($app): void {
$app->get('/reports', ReportsController::class)->name('index');
}, [\Icom\Middleware\Authenticate::class], 'reports.');
// Path: /api/v1/reports Name: reports.indexກວດຂອບເຂດກ່ອນ merge
architecture:check ໃຊ້ PHP-Parser ອ່ານ AST ຂອງ app/Modules; ບໍ່ execute ໄຟລ໌ທີ່ກວດ. ການອ້າງອີງຂ້າມ module ຕ້ອງມີ direct dependency ແລະເປັນ class/interface ໃນ Contracts. ຮອງຮັບ aliases, group imports ແລະ class-name strings ທີ່ເຫັນໄດ້ໂດຍກົງ. ໄຟລ໌ namespace ຜິດ, module ທີ່ບໍ່ລົງທະບຽນ, PHP ທີ່ parse ບໍ່ໄດ້ ຫຼື symlink ຈະຖືກລາຍງານ.
php bin/icom architecture:check
# Expected: violations is empty and ok is true.
# private-module-reference means a consumer used another module's internals.ຂອບເຂດຂອງການກວດ
ນີ້ແມ່ນ convention check ສຳລັບທີມ, ບໍ່ແມ່ນ security sandbox. Dynamic class names, reflection, eval, aliases ທີ່ສ້າງຕອນ runtime, SQL ທີ່ອ້າງຕາຕະລາງຂ້າມ module ແລະ external side effects ຕ້ອງມີ code review/tests ເພີ່ມ. config/modules.php ແມ່ນ trusted PHP configuration. ຖ້າ group callback ໂຍນ exception, prefix/middleware context ຈະກັບຄືນ ແຕ່ routes ທີ່ເພີ່ມແລ້ວບໍ່ຖືກ rollback; ໃຫ້ແກ້ bootstrap ແລະສ້າງ Application ໃໝ່.