feat: introduce module system and extract address book as first module (MODULAR-MONOLITH-V1-001)
Add a module kernel (ModuleManifest, ModuleRegistry) that allows modules to contribute routes, UI slots, search providers, layout context, session lifecycle, and permissions. Modules are activated via config/modules.php or APP_ENABLED_MODULES env variable. Conflicts (duplicate routes, permissions, slot keys) cause a fail-fast with a clear error message. Extract the address book from hardcoded Core integration points into the first module (modules/addressbook/). The module provides: - Aside icon-bar tab + People panel via UI slot system - Global search resource via AddressBookSearchProvider - Layout context data via AddressBookLayoutProvider - Session lifecycle via AddressBookSessionProvider Core cleanup removes address-book hardcodings from SearchSqlResourceProvider, SearchUiMetaProvider, SearchItemMapperProvider, appBuildLayoutNavContext(), and the aside templates. Permissions (ADDRESS_BOOK_VIEW) and business logic (AddressBookService) remain in Core as they gate general user visibility. Includes 38 new tests (894 total), PHPStan level 5 clean, and architecture tests verifying zero hardcoded address-book references in search/templates. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
57
modules/addressbook/module.php
Normal file
57
modules/addressbook/module.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Address Book module manifest.
|
||||
*
|
||||
* Contributes the "People" aside tab/panel, global search section,
|
||||
* layout context data, and session lifecycle.
|
||||
*
|
||||
* Permissions (address_book.view) remain in Core PermissionService because
|
||||
* they gate general user-visibility in UserAuthorizationPolicy, not just
|
||||
* address-book access. Asset groups remain in config/assets.php because the
|
||||
* asset pipeline does not yet consume ModuleRegistry::getAssetGroups().
|
||||
*/
|
||||
return [
|
||||
'id' => 'addressbook',
|
||||
'version' => '1.0.0',
|
||||
'enabled_by_default' => false,
|
||||
'load_order' => 10,
|
||||
|
||||
'routes' => [],
|
||||
'public_paths' => [],
|
||||
'container_registrars' => [],
|
||||
|
||||
'ui_slots' => [
|
||||
'aside.tab_panel' => [
|
||||
[
|
||||
'key' => 'people',
|
||||
'label' => 'Address book',
|
||||
'icon' => 'bi-people',
|
||||
'href' => 'address-book',
|
||||
'permission' => 'can_view_address_book',
|
||||
'panel_template' => __DIR__ . '/templates/aside-people-panel.phtml',
|
||||
'details_storage' => 'aside-people-tenant',
|
||||
'details_open_active' => true,
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'search_resources' => [
|
||||
\MintyPHP\Module\AddressBook\Providers\AddressBookSearchProvider::class,
|
||||
],
|
||||
|
||||
'asset_groups' => [],
|
||||
'scheduler_jobs' => [],
|
||||
|
||||
'layout_context_providers' => [
|
||||
\MintyPHP\Module\AddressBook\Providers\AddressBookLayoutProvider::class,
|
||||
],
|
||||
|
||||
'session_providers' => [
|
||||
\MintyPHP\Module\AddressBook\Providers\AddressBookSessionProvider::class,
|
||||
],
|
||||
|
||||
'permissions' => [],
|
||||
|
||||
'migrations_path' => 'db/updates',
|
||||
];
|
||||
Reference in New Issue
Block a user