tormjens/eventy
Lightweight WordPress events manager with clean templates and flexible shortcodes. Create and display events, venues, and organizers; list upcoming/past events, calendars, and single event pages. Developer-friendly hooks and theming options for easy integration.
Installation
composer require tormjens/eventy
Publish the config (if needed):
php artisan vendor:publish --provider="Tormjens\Eventy\EventyServiceProvider"
First Hook
Register a filter in a service provider (e.g., AppServiceProvider):
use Tormjens\Eventy\Facades\Eventy;
Eventy::filter('user.created', function ($user) {
// Modify the user before saving
$user->setAttribute('verified', true);
return $user;
});
Triggering a Hook
Use the Eventy::apply() method to run filters/actions:
$user = User::create([...]);
Eventy::apply('user.created', $user); // Runs all registered filters
Basic Action Register and trigger an action:
// Register
Eventy::action('user.logged_in', function ($user) {
Log::info("User logged in: {$user->email}");
});
// Trigger
Eventy::apply('user.logged_in', $user);
config/eventy.php for default settings (e.g., priority handling, debug mode).Tormjens\Eventy\Facades\Eventy is the primary entry point.Use Case: Modify data before saving/returning (e.g., sanitization, default values).
// Register a filter for API responses
Eventy::filter('api.user.response', function ($user) {
return $user->only(['id', 'name', 'email']); // Strip sensitive data
});
// Trigger in a controller
$user = User::find(1);
$response = Eventy::apply('api.user.response', $user);
return response()->json($response);
Leverage priority to control execution order:
// High priority (runs first)
Eventy::filter('order.process', function ($order) {
$order->setStatus('processing');
}, 100);
// Low priority (runs last)
Eventy::filter('order.process', function ($order) {
$order->sendNotification();
}, -100);
Use closures to conditionally apply hooks:
Eventy::filter('user.update', function ($user, $data) {
if (auth()->check() && auth()->user()->isAdmin()) {
$data['is_admin'] = true; // Only admins can set this
}
return $data;
});
Generate hook names dynamically for reusable logic:
function registerUserHooks($modelName) {
Eventy::filter("{$modelName}.created", function ($model) {
// Common logic for all models
$model->setAttribute('created_via', 'api');
return $model;
});
}
// Usage
registerUserHooks('user');
registerUserHooks('post');
Bridge Laravel’s built-in events to eventy hooks:
// In a service provider
Event::listen('user.created', function ($user) {
Eventy::apply('user.created', $user);
});
Mock hooks in tests using partials:
// Test file
Eventy::partial('user.created', function ($user) {
$this->assertEquals('verified', $user->verified);
});
// Run test
Eventy::apply('user.created', new User());
Priority Collisions
0. Overlapping priorities may lead to undefined behavior.100, -100).Memory Leaks with Closures
booted methods or use Eventy::forget().Circular Dependencies
Eventy::filter('user.update', function ($user) {
if (!isset($user->skipHook)) {
$user->skipHook = true;
// ... logic
unset($user->skipHook);
}
});
Debugging Hooks
config/eventy.php to log hook execution:
'debug' => env('APP_DEBUG', false),
Namespace Hooks
Prefix hooks to avoid collisions (e.g., auth.user.login instead of user.login).
Use Partials for Testing Temporarily override hooks in tests without modifying production code:
Eventy::partial('user.created', function ($user) {
// Test-specific logic
});
Performance For high-traffic apps, cache hook registrations:
Eventy::cacheHooks(true); // Enable in config
Extending Functionality
Eventy facade to support before/after hooks:
Eventy::before('user.delete', function ($user) {
// Pre-delete logic
});
Laravel 10+ Compatibility
composer.json supports your PHP/Laravel version.tormjens/eventy package for Laravel 10+ fixes.Security
Eventy::filter('user.update', function ($user, $data) {
$data = array_intersect_key($data, array_flip(['name', 'email'])); // Whitelist
return $data;
});
How can I help you explore Laravel packages today?