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>
58 lines
1.6 KiB
PHP
58 lines
1.6 KiB
PHP
<?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',
|
|
];
|