zetacomponents/base
Core utilities for the Zeta Components (eZ Components) library. Provides foundational classes for exceptions, autoloading, file and path handling, and common helpers used across components. Suitable as a shared base dependency for PHP projects.
Installation
composer require zetacomponents/base
Add to composer.json under autoload:
"autoload": {
"psr-4": {
"App\\": "app/",
"Zeta\\Components\\Base\\": "vendor/zetacomponents/base/src/"
}
}
Run composer dump-autoload.
First Use Case: Basic Component Initialization
use Zeta\Components\Base\Base;
$component = new Base();
$component->setName('MyComponent');
echo $component->getName(); // Outputs: MyComponent
Key Classes to Explore
Base (Core base class for components)Component (Extended base with common traits)ComponentCollection (For managing multiple components)Where to Look First
Zeta/Components/Base/Component.php (Core functionality)Zeta/Components/Base/ComponentCollection.php (Group management)use Zeta\Components\Base\Component;
class MyComponent extends Component {
protected function initialize() {
// Runs on component creation
$this->setDefault('config.key', 'default_value');
}
protected function finalize() {
// Runs on component destruction
$this->log('Component finalized');
}
}
$component = new MyComponent();
$component->setConfig(['key' => 'value']);
$value = $component->getConfig('key'); // Returns 'value'
$default = $component->getConfig('missing', 'fallback'); // Returns 'fallback'
$component->on('event.name', function($sender, $eventArgs) {
// Handle event
});
$component->trigger('event.name', ['arg1' => 'value']);
$component->setDependency('logger', new Logger());
$logger = $component->getDependency('logger');
use Zeta\Components\Base\ComponentCollection;
$collection = new ComponentCollection();
$collection->addComponent(new MyComponent());
$collection->addComponent(new AnotherComponent());
foreach ($collection as $component) {
$component->doWork();
}
// Register in a service provider
$this->app->singleton('my.component', function ($app) {
$component = new MyComponent();
$component->setDependency('app', $app);
return $component;
});
// Usage in controllers
$component = app('my.component');
Circular Dependencies
Configuration Overrides
setConfig() will override defaults, even if set later. Test edge cases where configs are modified dynamically.Event Memory Leaks
$component->off('event.name');
Namespace Collisions
Component, ensure your class namespace doesn’t conflict with existing Zeta components (e.g., avoid Zeta\Components\Base\MyComponent).Finalize() Not Always Called
finalize() may not run if the component is garbage collected abruptly (e.g., during a script exit). Use try-catch blocks in finalize() for critical cleanup.Enable Component Logging
$component->setLogLevel(Zeta\Components\Base\Logger::LEVEL_DEBUG);
$component->log('Debug message');
Inspect Dependencies
$dependencies = $component->getDependencies();
// Dump dependencies for debugging
dd($dependencies);
Check Event Flow
trigger() with a debug callback to trace event propagation:
$component->on('event.name', function($sender, $args) {
dd('Event triggered!', $args);
});
Custom Traits Extend functionality by adding traits to your component:
trait MyTrait {
public function myMethod() {
return 'Extended functionality';
}
}
class MyComponent extends Component {
use MyTrait;
}
Override Core Methods
class MyComponent extends Component {
protected function initialize() {
parent::initialize();
// Custom initialization logic
}
}
Create Custom Collections
Extend ComponentCollection for domain-specific behavior:
class MyComponentCollection extends ComponentCollection {
public function filterByType($type) {
return $this->filter(function($component) use ($type) {
return $component instanceof $type;
});
}
}
Integrate with Laravel’s Container
Use the setDependency() method to inject Laravel services:
$component->setDependency('request', app('request'));
$component->setDependency('cache', app('cache.store'));
initialize() should be lightweight).ComponentCollection Efficiently: For large collections, consider implementing ArrayAccess or IteratorAggregate for optimized iteration.How can I help you explore Laravel packages today?