The HMVC and Hook Orchestration Kernel for CodeIgniter 4
StarCore is a lightweight, powerful library designed to bring Hierarchical Model-View-Controller (HMVC) architecture and a robust Hook Orchestration system to CodeIgniter 4 applications. It enables modular application development and provides a flexible event-driven architecture.
- HMVC Architecture: Organize your application into reusable modules with their own routes, controllers, models, and views.
- Hook Orchestration: A powerful event system supporting Actions, Filters, and Triggers with priority management.
- Module Autoloading: Automatically discovers and loads modules from
modules/directory. - Zero Configuration: Works out of the box with sensible defaults, but fully configurable.
Install via Composer:
composer require damarbob/starcoreBy default, StarCore looks for modules in the modules/ directory. You can configure active modules in Config/Star.php (publish this file to your application's app/Config directory if needed, or modify it in place for the library).
// app/Config/Star.php
protected string $activeModules = 'Blog,Auth,Shop';Alternatively, you can set this in your .env file:
Star.activeModules = 'Blog,Auth,Shop'Development modules are located in the modules/.star-dev/ directory. These modules are either experimental or intended for development tools and features, and should not be enabled in production.
You can configure active development modules in Config/Star.php:
protected string $activeDevModules = 'DebugToolbar,Generator';Alternatively, you can set this in your .env file:
Star.activeDevModules = 'DebugToolbar,Generator'Note: Development modules are automatically disabled when
safeModeis enabled.
Safe mode disables all modules, useful for debugging or maintenance.
public bool $safeMode = true;StarCore provides a global helper function hook() and a service HyperHooks to manage events.
You can register hooks in your module's init.php or any other loaded file.
use StarCore\Service\HyperHooks;
// Register an action (side-effect)
HyperHooks::getInstance()->register('user.login', function($user) {
log_message('info', 'User logged in: ' . $user->id);
});
// Register a filter (modify value)
HyperHooks::getInstance()->register('content.render', function($content) {
return strtoupper($content);
});// Trigger an action
$hooks = service('hooks');
$hooks->action('user.login', [$currentUser]);
// Apply filters
$content = "hello world";
$content = $hooks->filter('content.render', $content); // Returns "HELLO WORLD"The hook() helper is used to retrieve hook configurations or values from Hooks/ files in your modules.
// Returns the value of 'header' from 'Hooks/Frontend.php'
$headerHook = hook('Frontend.header');To create a hook that can be retrieved via the hook() helper, create a file in your module's Hooks/ directory (e.g., modules/Blog/Hooks/Frontend.php). This file should return an associative array of Star\HyperHook objects.
<?php
use StarCore\Star\HyperHook;
return [
'header' => new HyperHook('header', 'Header Hook', 'This hook is used to display the header.'),
'footer' => new HyperHook('footer', 'Footer Hook', 'This hook is used to display the footer.'),
];You can then access these hooks using hook('Frontend.header') or hook('Frontend.footer').
You can use placeholders in your hook values to make them dynamic. Placeholders are defined using curly braces, e.g., {name}.
1. Create a hook with a placeholder:
// modules/Blog/Hooks/Greetings.php
return [
'welcome' => new HyperHook('welcome', 'Welcome Message', 'Welcome back, {name}!'),
];2. Retrieve the hook with parameters:
Pass an associative array as the second argument to the hook() helper to replace the placeholders.
// Returns "Welcome back, John!"
echo hook('Greetings.welcome', ['name' => 'John']);A typical module structure looks like this:
modules/
Blog/
Config/
Routes.php
Controllers/
Models/
Views/
Hooks/
init.php
A typical development module structure looks like this:
modules/
.star-dev/
DebugToolbar/
Config/
Routes.php
Controllers/
Models/
Views/
Hooks/
init.php
StarCore automatically discovers and loads modules located in the modules/ directory (and modules/.star-dev/ for development modules). This process happens immediately when the library is loaded (before the pre_system event) to ensure namespaces and event listeners are available during the application bootstrapping.
- Namespace Registration: The autoloader automatically registers the module's namespace based on its directory name. For example, a module in
modules/Blogwill have theBlognamespace registered. - Initialization: If an
init.phpfile exists in the module's root, it is executed. This is the ideal place to register hooks or perform other setup tasks.
StarCore is designed to work seamlessly with Composer.
- Library Support: You can use any StarCore-supported module as a Composer package. Simply require it in your project's
composer.jsonand use it as usual. StarCore prioritizes Composer packages over its own modules. - Local Modules: Unlike Composer’s autoloader, StarCore’s autoloader automatically registers namespaces for modules in the
modules/directory. This means you don’t need to runcomposer dump-autoloadevery time you create a new module or class, helping speed up your development workflow.
Choose the option that best fits your needs.
This project is licensed under the MIT License.