allow plugins to load additionals composer packages

This commit is contained in:
Boy132 2025-07-04 11:11:58 +02:00
parent 2ee4df8139
commit 72b9a24ac4
4 changed files with 64 additions and 4 deletions

View File

@ -0,0 +1,29 @@
<?php
namespace App\Console\Commands\Plugin;
use App\Facades\Plugins;
use App\Models\Plugin;
use Exception;
use Illuminate\Console\Command;
class ComposerPluginsCommand extends Command
{
protected $signature = 'p:plugin:composer';
protected $description = 'Runs composer require on all installed plugins.';
public function handle(): void
{
$plugins = Plugin::all();
foreach ($plugins as $plugin) {
try {
Plugins::requireComposerPackages($plugin);
} catch (Exception $exception) {
report($exception);
$this->error($exception->getMessage());
}
}
}
}

View File

@ -12,10 +12,11 @@ class CreatePluginCommand extends Command
{name}
{author}
{--description=}
{--category=}
{--url=}
{--updateUrl=}
{--panels=}
{--category=}';
{--composerPackages=}';
protected $description = 'Create a new plugin';
@ -61,6 +62,7 @@ class CreatePluginCommand extends Command
'server' => 'Client Area',
'app' => 'Server List',
], 'admin,server', multiple: true);
$composerPackages = $this->option('composerPackages') ?? $this->ask('Composer Packages');
// Create base directory
$this->filesystem->makeDirectory(plugin_path($id));
@ -84,6 +86,7 @@ class CreatePluginCommand extends Command
'class' => $class,
'panels' => !is_array($panels) ? explode(',', $panels) : $panels,
'panel_version' => config('app.version') === 'canary' ? null : config('app.version'),
'composer_packages' => !is_array($composerPackages) ? explode(',', $composerPackages) : $composerPackages,
], JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
// Create src directory and create main class

View File

@ -23,6 +23,7 @@ use Sushi\Sushi;
* @property string $class
* @property string|null $panels
* @property string|null $panel_version
* @property string|null $composer_packages
* @property PluginStatus $status
* @property string|null $status_message
* @property int $load_order
@ -55,6 +56,7 @@ class Plugin extends Model implements HasPluginSettings
'class' => 'string',
'panels' => 'string',
'panel_version' => 'string',
'composer_packages' => 'string',
'status' => 'string',
'status_message' => 'string',
'load_order' => 'integer',
@ -75,6 +77,7 @@ class Plugin extends Model implements HasPluginSettings
* class: string,
* panels: string,
* panel_version: string,
* composer_packages: string,
* status: string,
* status_message: string,
* load_order: int
@ -102,6 +105,10 @@ class Plugin extends Model implements HasPluginSettings
$data['panels'] = implode(',', $data['panels']);
}
if (is_array($data['composer_packages'])) {
$data['composer_packages'] = implode(',', $data['composer_packages']);
}
$plugins[] = $data;
}

View File

@ -10,13 +10,14 @@ use Filament\Panel;
use Illuminate\Console\Application as ConsoleApplication;
use Illuminate\Console\Command;
use Illuminate\Foundation\Application;
use Illuminate\Support\Composer;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Illuminate\Support\ServiceProvider;
class PluginService
{
public function __construct(private Application $app) {}
public function __construct(private Application $app, private Composer $composer) {}
public function loadPlugins(): void
{
@ -141,14 +142,34 @@ class PluginService
}
}
public function installPlugin(Plugin $plugin): void
public function requireComposerPackages(Plugin $plugin): void
{
if ($plugin->composer_packages) {
$this->composer->requirePackages(explode(',', $plugin->composer_packages));
}
}
public function runPluginMigrations(Plugin $plugin): void
{
$migrations = plugin_path($plugin->id, 'database', 'migrations');
if (file_exists($migrations)) {
Artisan::call('migrate', ['--path' => $migrations, '--force' => true]);
}
}
$this->setStatus($plugin, PluginStatus::Enabled);
public function installPlugin(Plugin $plugin): void
{
try {
$this->requireComposerPackages($plugin);
$this->runPluginMigrations($plugin);
$this->enablePlugin($plugin);
} catch (Exception $exception) {
report($exception);
$this->setStatus($plugin, PluginStatus::Errored, $exception->getMessage());
}
}
public function enablePlugin(string|Plugin $plugin): void