Installation
composer require cleentfaar/trigger-bundle
Add to config/bundles.php:
return [
// ...
Cleentfaar\TriggerBundle\CLTriggerBundle::class => ['all' => true],
];
Configure Triggers
Define triggers in config/packages/cleentfaar_trigger.yaml:
cleentfaar_trigger:
triggers:
reset_password:
parameter: reset
handler: App\Handler\ResetPasswordHandler
redirect:
url: /login
strip_parameters: [reset, token]
First Use Case Trigger a one-time action via URL:
/dashboard?reset=true
The ResetPasswordHandler will execute, then redirect to /login with reset and token removed.
One-Time Actions Use for password resets, email verifications, or temporary state changes:
cleentfaar_trigger:
triggers:
verify_email:
parameter: verify
handler: App\Handler\VerifyEmailHandler
redirect: /dashboard
Conditional Execution
Combine with Symfony’s RequestStack to check additional conditions:
// src/Handler/ResetPasswordHandler.php
public function handle(Request $request, $value)
{
if (!$request->get('token')) {
throw new \RuntimeException('Token missing');
}
// Proceed with logic
}
Parameter Stripping Automatically clean URLs post-execution:
redirect:
strip_parameters: [action, id, token]
Event-Based Triggers Dispatch Symfony events inside handlers:
$eventDispatcher->dispatch(new PasswordResetEvent($user));
Dependency Injection Use Symfony’s autowiring to inject services into handlers:
// src/Handler/ExampleHandler.php
public function __construct(private UserRepository $users)
{
}
Validation Validate parameters in handlers before processing:
if (!preg_match('/^[a-f0-9]{64}$/', $value)) {
throw new \InvalidArgumentException('Invalid token format');
}
Logging Log trigger executions for debugging:
$this->logger->info('Trigger executed', ['trigger' => 'reset_password', 'params' => $request->query->all()]);
Parameter Collisions
Avoid naming triggers after existing route parameters to prevent conflicts. Use unique names like trigger_verify_email.
Handler Visibility Handlers must be public and follow the signature:
public function handle(Request $request, $value): void
Redirect Loops
Ensure redirect.url does not include the trigger parameter to avoid infinite redirects.
Case Sensitivity
Trigger parameters are case-sensitive (?Reset=true ≠ ?reset=true).
Caching Issues Clear Symfony’s cache after adding/updating triggers:
php bin/console cache:clear
Check Trigger Execution Enable debug mode to see if handlers are called:
APP_ENV=dev APP_DEBUG=1 php bin/console server:run
Look for handler logs in var/log/dev.log.
Validate YAML
Use symfony/validator to validate config:
php bin/console debug:config cleentfaar_trigger
Custom Handlers
Extend Cleentfaar\TriggerBundle\Handler\AbstractHandler for reusable logic.
Dynamic Triggers Register triggers programmatically in a compiler pass:
// src/DependencyInjection/Compiler/TriggerPass.php
public function process(ContainerBuilder $container)
{
$definition = $container->findDefinition('cleentfaar_trigger.handler.dynamic');
$definition->addMethodCall('addTrigger', ['dynamic_name', new Reference('service.id')]);
}
Middleware Integration
Use Symfony’s Middleware to pre-process requests before trigger evaluation:
// src/Kernel.php
$middleware->add(new class implements MiddlewareInterface {
public function handle(Request $request, callable $next): Response {
if ($request->query->has('trigger')) {
// Custom logic
}
return $next($request);
}
});
Event Listeners
Listen for trigger.pre_execute and trigger.post_execute events:
# config/services.yaml
services:
App\EventListener\TriggerListener:
tags:
- { name: kernel.event_listener, event: trigger.pre_execute, method: onPreExecute }
How can I help you explore Laravel packages today?