binarybuilds/filament-command-runner
Installation:
composer require binarybuilds/filament-command-runner
Publish the config and migrations:
php artisan vendor:publish --provider="BinaryBuilds\FilamentCommandRunner\FilamentCommandRunnerServiceProvider" --tag="filament-command-runner-config"
php artisan vendor:publish --provider="BinaryBuilds\FilamentCommandRunner\FilamentCommandRunnerServiceProvider" --tag="filament-command-runner-migrations"
php artisan migrate
Register the Plugin:
Add to app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\BinaryBuilds\FilamentCommandRunner\FilamentCommandRunnerPlugin::make(),
]);
}
First Use Case:
Define a command in config/filament-command-runner.php:
'commands' => [
'optimize:clear' => [
'label' => 'Optimize:Clear',
'description' => 'Clear Laravel cache and optimize',
'command' => 'optimize:clear',
'is_artisan' => true,
'is_hidden' => false,
],
],
Access via Filament Admin Panel > Command Runner tab.
Command Definition:
is_artisan: true and specify the command name.is_artisan: false and provide the full shell command (e.g., command: 'php artisan queue:work --once').command closure for runtime-generated commands:
'command' => function () {
return 'queue:work --once --queue=' . request('queue');
},
Grouping Commands:
Organize commands into logical groups using the group key:
'commands' => [
'cache' => [
'group' => 'Cache Management',
'commands' => [
'optimize:clear',
'cache:clear',
],
],
],
Permissions & Visibility: Control access via Filament’s built-in policies or custom gates:
'commands' => [
'migrate' => [
'is_hidden' => true, // Hide by default
'can_run' => function () {
return auth()->user()->can('run-migrations');
},
],
],
Output Handling:
Integration with Filament Resources/Pages: Embed the command runner in custom pages:
use BinaryBuilds\FilamentCommandRunner\Widgets\CommandRunnerWidget;
public static function getWidgets(): array
{
return [
CommandRunnerWidget::make()
->commands(['optimize:clear', 'queue:work']),
];
}
Command Timeouts:
max_execution_time. Configure via config/filament-command-runner.php:
'timeout' => 3600, // 1 hour in seconds
nohup or disown).Database Bloat:
command_runs table. Implement cleanup via:
'prune_old_logs' => true, // Enable in config
'log_retention_days' => 30, // Keep logs for 30 days
Permission Issues:
sudo cautiously or adjust file permissions:
chmod -R 775 storage/
WebSocket Dependencies:
Command Failures:
storage/logs/laravel.log for execution errors.Queue Workers:
php artisan queue:work) for background execution:
'uses_queue' => true, // Enable in config
Output Truncation:
max_output_length in config to handle large outputs:
'max_output_length' => 10000, // 10KB
Custom Command Classes:
Extend \BinaryBuilds\FilamentCommandRunner\Commands\Command for reusable logic:
namespace App\Commands;
use BinaryBuilds\FilamentCommandRunner\Commands\Command;
class CustomCommand extends Command
{
public function getCommand(): string
{
return 'custom:command --param=' . $this->param;
}
}
Event Listeners:
Listen for command events (e.g., CommandStarted, CommandCompleted):
use BinaryBuilds\FilamentCommandRunner\Events\CommandCompleted;
CommandCompleted::listen(function (CommandCompleted $event) {
Log::info('Command finished: ' . $event->command);
});
API Access: Expose commands via a custom API endpoint for non-admin users:
Route::post('/api/run-command', function () {
return \BinaryBuilds\FilamentCommandRunner\Facades\CommandRunner::run(
request('command'),
request('user') // Optional: associate with a user
);
});
Theming: Customize the UI via Filament’s theming system:
FilamentCommandRunnerPlugin::make()
->colors([
'success' => '#10B981',
'danger' => '#EF4444',
]),
How can I help you explore Laravel packages today?