cleverage/ui-process-bundle
CleverAge/UiProcessBundle adds a simple EasyAdmin-based UX to the CleverAge ProcessBundle for Symfony, giving you a ready-made interface to view and manage your process workflows.
cleverage/process-bundle ^5.3 is now required (needed for the stop-checker integration).composer require cleverage/ui-process-bundle:^3.2
Version20261013120000 — adds process_schedule.enabled (existing schedules are enabled by default).Version20261014120000 — adds nullable process_execution.stop_requested_at and process_execution.heartbeat_at.php artisan migrate
php artisan cleverage:ui-process:run example # start something
# then hit "Stop the process" on the started execution in the UI
config/cleverage_ui_process.php — now also holds process_execution.heartbeat_interval, process_execution.stale_after, and logs.database_max_days / logs.file_max_days.vendor/cleverage/ui-process-bundle/ — source for extension points (ProcessExecutionStopChecker, ProcessScheduleRepository, ProcessConfigurationsManager).php artisan vendor:publish --tag=cleverage-ui-process-config
Process Definition:
config/cleverage_ui_process.php under processes.logs option to override the global retention settings:'processes' => [
'example' => [
'steps' => [
['command' => 'php artisan queue:work'],
['command' => 'php artisan cache:clear'],
],
'logs' => [
'database_max_days' => 30,
'file_max_days' => 14,
],
],
],
CLI Integration:
php artisan cleverage:ui-process:run example
--option=value (e.g., --env=production).Scheduler Behaviour (new):
ProcessSchedule::$enabled (default true) or the switch in the schedules list.scheduler_cron worker.CronProcessMessageHandler re-reads it from the database through ProcessScheduleRepository::findFresh() (the handler now takes optional $repository and $logger arguments), so a schedule disabled or deleted after the worker started is not run, and its current input/context is used.Stopping Executions (new):
ProcessExecution::$stopRequestedAt.ProcessExecutionStopChecker (tag cleverage_process.stop_checker) is consulted before each task execution, at most every process_execution.heartbeat_interval seconds (default 5, DBAL read).ProcessExecutionStatus::Stopped; the UI shows "Stop requested" until then.NotificationTrigger::Stopped exists but is not notified by default — opt in via your notification configuration.Heartbeat & Stale Detection (new):
ProcessExecutionStopChecker refreshes ProcessExecution::$heartbeatAt.started execution with no activity for more than process_execution.stale_after seconds (default 900) shows as "Not responding".ProcessExecutionCrudController accepts a new optional $staleAfter constructor argument if you need a different threshold at the controller level.Log Retention (new):
php artisan cleverage:ui-process:purge-logs --dry-run # preview
php artisan cleverage:ui-process:purge-logs
log_record rows (in batches) older than logs.database_max_days and <code>/<uuid>.log files last modified more than logs.file_max_days days ago.null (nothing deleted) — you must opt in globally or per process via the logs option (ProcessConfigurationsManager::getLogsOptions()).scheduler_cron or your own scheduler) as part of routine maintenance.ProcessStarted/ProcessFailed still apply, and you can now add a Stopped handler.cleverage_process.stop_checker if you need extra conditions beyond stopRequestedAt/heartbeat.stopped notification status into your notifiers so stopping is visible in the same channel as success/failure.cleverage/process-bundle ^5.3 required:
composer require cleverage/process-bundle:^5.3 and clear caches.php artisan migrate on every environment, including workers.scheduler_cron worker only loads enabled schedules at boot. Restart it after re-enabling.stopped is not notified by default:
NotificationTrigger::Stopped in your notification configuration if you want parity with success/failure.heartbeat_interval: It is both the stop-check DB-read cadence and the "how fast does Stop take effect" knob. Default 5s is fine for most apps; lower means more DB queries per running execution.null: Logs are kept forever until you set logs.database_max_days / logs.file_max_days. Set both — a database-only policy will leave files on disk.log_record delete, run a VACUUM (PostgreSQL) / table optimize (MySQL) — see the package docs on giving space back after the first purge.--dry-run before production: Always preview cleverage:ui-process:purge-logs once to confirm your retention windows behave as expected.--help for command-specific args (e.g. php artisan cleverage:ui-process:purge-logs --help).php artisan make:command CustomProcessCommand
Inject Cleverage\UiProcessBundle\Command\ProcessRunner to reuse logic.cleverage_process.stop_checker tag to add custom abort conditions (the built-in ProcessExecutionStopChecker is a good reference; it uses DBAL for a lightweight heartbeat/stop-request read).ProcessScheduleRepository (notably findFresh()) if your schedules come from a non-default source; CronProcessMessageHandler accepts it as an optional constructor argument.ProcessStarted / ProcessFailed / Stopped for pre/post hooks:
public function handle(ProcessStarted $event) {
Log::info('Process ID: '.$event->getProcess()->getId());
}
process_execution.heartbeat_interval, process_execution.stale_after, logs.*, and per-process logs.-vvv to CLI commands for Symfony debug logs.storage/logs/laravel.log for subprocess errors; per-execution files live at <code>/<uuid>.log (these are what file_max_days targets).process-bundle ^5.3, that the migration ran, that stop_requested_at is actually set in the DB, and that the execution is in a state where a task boundary will be reached.process_execution.heartbeat_at) and that stale_after is smaller than your longest expected idle gap.How can I help you explore Laravel packages today?