panel:plugins
Menampilkan plugin apa saja yang terpasang, pada Panel mana plugin diregistrasikan, serta version dan compatibility requirement-nya.
Gunakan command ini ketika sebuah Panel bermasalah dan Anda perlu mengetahui:
- screen/resource/widget berasal dari plugin mana;
- version plugin yang sedang digunakan.
Output command ini juga berguna untuk disertakan dalam bug report.
php artisan panel:pluginsContoh:
+-------+---------+---------+---------------------+---------+----------+
| Panel | ID | Name | Package | Version | Requires |
+-------+---------+---------+---------------------+---------+----------+
| admin | billing | Billing | acme/panda-billing | 1.4.1 | ^1.2 |
| admin | audit | Audit | in this application | unknown | any |
| app | billing | Billing | acme/panda-billing | 1.4.1 | ^1.2 |
+-------+---------+---------+---------------------+---------+----------+2
3
4
5
6
7
Sebuah Panel dengan beberapa plugin memiliki beberapa sumber:
- Resources;
- Pages;
- Widgets;
- Routes.
Saat salah satunya bermasalah, mengetahui plugin dan version jauh lebih berguna daripada stack trace yang hanya menyebut framework.
Signature
panel:plugins
{--panel= : Only this panel}2
| Option | Default | Efek |
|---|---|---|
--panel= | semua Panel | Filter berdasarkan Panel id dengan exact match, bukan prefix. |
php artisan panel:plugins
php artisan panel:plugins --panel=admin2
Panel id berasal dari provider class:
AdminPanelProvider
→ admin2
Jika value tidak cocok dengan Panel mana pun, command menghasilkan zero rows dan tidak dianggap failure.
Empty string dianggap sama dengan tidak memberikan filter.
Jika tidak ada plugin:
INFO No plugins are registered.Column pada Report
| Column | Sumber | Fallback |
|---|---|---|
| Panel | Panel::getId() | — |
| ID | key pada Panel::getPlugins(), yaitu PanelPlugin::id() | — |
| Name | PluginMetadata::$name | Base Plugin memberi headline dari id |
| Package | PluginMetadata::$package | in this application |
| Version | PluginMetadata::version() | unknown |
| Requires | PluginMetadata::$requiresPanel | any |
in this application dan unknown memiliki arti berbeda.
in this application berarti plugin tidak mendeklarasikan Composer package. Ini valid untuk project-local plugin yang version-nya mengikuti application.
unknown berarti metadata menyebut package yang tidak diketahui Composer. Ini biasanya metadata bug pada plugin.
Sumber Version
Version dibaca langsung dari Composer installed package data melalui:
Composer\InstalledVersions::getPrettyVersion()Jadi jika report menampilkan:
1.4.1itulah actual installed version, bukan version string yang harus di-update manual oleh plugin author.
PluginMetadata:
use PandaPanel\Plugins\PluginMetadata;
final readonly class PluginMetadata
{
public function __construct(
public string $name,
public ?string $package = null,
public ?string $requiresPanel = null,
public ?string $url = null,
) {}
public function version(): ?string;
/** @return array{name: string, package: string|null, version: string|null, requiresPanel: string|null, url: string|null} */
public function toArray(): array;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Contoh plugin metadata:
use PandaPanel\Plugins\Plugin;
use PandaPanel\Plugins\PluginMetadata;
final class BillingPlugin extends Plugin
{
public function metadata(): PluginMetadata
{
return new PluginMetadata(
name: 'Billing',
package: 'acme/panda-billing',
requiresPanel: '^1.2',
url: 'https://example.com/panda-billing',
);
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
url tersedia di metadata tetapi tidak ditampilkan sebagai table column agar report tidak terlalu lebar.
Baca menggunakan:
$plugin->metadata()->toArray();Membaca Data yang Sama dari Code
use PandaPanel\Core\PanelManager;
$manager = app(PanelManager::class);
foreach ($manager->all() as $panel) {
foreach ($panel->getPlugins() as $id => $plugin) {
$metadata = $plugin->metadata();
printf(
"%s / %s %s\n",
$panel->getId(),
$id,
$metadata->version() ?? 'unknown',
);
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
API:
| Method | Signature |
|---|---|
PanelManager::all() | all(): list<Panel> — sorted berdasarkan Panel id |
Panel::getPlugins() | getPlugins(): array<string, PanelPlugin> |
Panel::hasPlugin() | hasPlugin(string $id): bool |
Panel::plugin() | plugin(string $id): ?PanelPlugin |
PanelPlugin::metadata() | metadata(): PluginMetadata |
hasPlugin() hanya memeriksa plugin id, bukan version. ID harus stabil antar-release.
Bagaimana Plugin Dipasang ke Panel
Plugin diregistrasikan secara eksplisit pada Panel Provider.
Plugin tidak:
- didiscover otomatis;
- didaftarkan melalui
config/panda-panel.php.
Contoh:
use Acme\PandaBilling\BillingPlugin;
use PandaPanel\Core\Panel;
use PandaPanel\Core\PanelProvider;
final class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->path('admin')
->plugins([new BillingPlugin]);
}
}2
3
4
5
6
7
8
9
10
11
12
13
Dua plugin dengan id yang sama pada Panel yang sama menyebabkan:
PandaPanel\Exceptions\PanelRegistrationException::duplicatePlugin()saat boot.
requiresPanel juga diperiksa saat plugin diregistrasikan. Dengan begitu incompatible plugin dapat melaporkan compatibility problem sejak registration, bukan gagal jauh di dalam request.
Command Plugin Lain: panel:publish
Plugin yang membawa Vue components perlu mempublish component ke source tree application karena component registry menggunakan build-time import.meta.glob.
Signature:
panel:publish
{plugin? : Only this plugin}
{--force : Overwrite files that already exist}2
3
Contoh:
php artisan panel:publish
php artisan panel:publish billing
php artisan panel:publish billing --force2
3
Output:
[billing] /app/resources/js/pages/Panels/Admin/Widgets/Invoices.vue ..... published
[billing] /app/resources/js/pages/Panels/Admin/Widgets/Plan.vue ... exists, skipped
INFO Published 2 file(s).2
3
Command berjalan melalui semua plugin pada semua Panel kemudian membaca:
publishes(): array<string, string>dengan bentuk:
source path
→ destination path2
Directory juga didukung.
Existing destination dilewati secara default dan dilaporkan.
--force menimpa existing file.
Source yang tidak ada hanya menghasilkan warning:
WARN [billing] /app/vendor/acme/panda-billing/resources/js does not exist.Jika tidak ada yang perlu dipublish:
Nothing to publish.dengan exit 0.
Exit Codes
panel:plugins dan panel:publish selalu return:
0Listing zero plugin adalah hasil valid.
Publish source yang tidak ada juga dilaporkan sebagai warning, bukan command failure.
Hal yang Perlu Diperhatikan
- Plugin tampil satu kali per Panel tempat ia diregistrasikan. Plugin yang sama pada dua Panel menghasilkan dua row karena konfigurasi masing-masing Panel dapat berbeda.
--panelmelakukan exact match terhadap id, bukan path atau display name.- Plugin tidak didiscover. Composer package yang terinstall tetapi tidak dimasukkan ke
plugins([...])tidak akan muncul. unknownmenandakan metadata package yang tidak dapat ditemukan Composer.panel:publishtidak menimpa file secara default. Dengan--force, file ditimpa tanpa backup; commit dulu.- Published plugin component membutuhkan frontend build.
import.meta.globdievaluasi saat build.