make:panel
Command ini melakukan scaffold Panel Provider beserta tiga directory yang dipindai discovery.
Gunakan ketika application membutuhkan Panel tambahan selain Panel yang dibuat panel:install, misalnya:
Adminuntuk staff;Appuntuk customer;- atau ketika Anda membangun Panel pertama secara manual.
php artisan make:panel AdminOutput:
INFO Created [app/Panels/Admin/AdminPanelProvider.php]
INFO Add App\Panels\Admin\AdminPanelProvider::class to 'panels' in config/panda-panel.php.2
Setelah provider diregistrasikan ke config, Panel dapat diakses melalui /admin.
Signature
make:panel
{name : The panel name, for example Admin}
{--path= : The URL prefix, defaults to the kebab-cased name}
{--force}2
3
4
| Argument / option | Type | Default | Efek |
|---|---|---|---|
name | required argument | — | Diubah menjadi StudlyCase. admin dan Admin menjadi Admin; back-office menjadi BackOffice. Hanya huruf pertama tiap word yang dinormalisasi, jadi aDmIn menjadi ADmIn. |
--path= | option | kebab-case dari name | URL prefix yang ditulis ke ->path(). |
--force | flag | off | Menimpa provider yang sudah ada. |
php artisan make:panel Admin
php artisan make:panel Admin --path=back-office
php artisan make:panel BackOffice # path default: back-office
php artisan make:panel Admin --force2
3
4
File yang Dibuat
app/Panels/Admin/
AdminPanelProvider.php
Resources/.gitkeep
Pages/.gitkeep
Widgets/.gitkeep2
3
4
5
Tiga file .gitkeep dibuat karena discovery akan memindai directory tersebut, sementara Git tidak menyimpan empty directory.
Tanpa .gitkeep, fresh clone dapat memiliki provider yang menunjuk path yang belum ada. Panel tetap boot tetapi sidebar kosong tanpa error, yang membuat troubleshooting menjadi membingungkan.
.gitkeep dibuat secara silent:
- tidak dicetak sebagai file baru;
- existing
.gitkeeptidak disentuh walaupun--forcedigunakan.
Provider yang Dihasilkan
<?php
declare(strict_types=1);
namespace App\Panels\Admin;
use PandaPanel\Core\Panel;
use PandaPanel\Core\PanelProvider;
final class AdminPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->path('admin')
->name('Admin')
->icon('layout-grid')
->auth()
->discoverResources(app_path('Panels/Admin/Resources'))
->discoverPages(app_path('Panels/Admin/Pages'))
->discoverWidgets(app_path('Panels/Admin/Widgets'));
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Provider tersebut sudah merupakan Panel yang lengkap dan dapat bekerja:
- memiliki path;
- display name;
- navigation icon;
- authentication;
- resource discovery;
- page discovery;
- widget discovery.
Walaupun belum memiliki Resource atau Page custom, Panel tetap dapat dirender karena setiap Panel memiliki dashboard route pada path-nya sendiri.
Mendaftarkan Panel
make:panel tidak mengedit config secara otomatis.
Registration sengaja merupakan edit eksplisit, karena daftar pada config adalah sumber yang menunjukkan semua Panel milik application.
Tambahkan provider ke:
// config/panda-panel.php
'panels' => [
App\Panels\Admin\AdminPanelProvider::class,
App\Panels\App\AppPanelProvider::class,
],2
3
4
5
6
Provider yang tidak terdaftar tidak memiliki runtime presence:
- tidak ada route;
- tidak ada navigation;
- path menghasilkan
404.
Urutan pada array config tidak menentukan urutan runtime. PanelRegistry::all() melakukan sort berdasarkan id.
Jadi ketika sebuah request tidak menentukan Panel, Panel pertama adalah Panel dengan id yang berada paling awal secara sort.
panel:install menggunakan:
PandaPanel\Support\Installer\PanelRegistraruntuk menambahkan line config secara otomatis.
make:panel sendiri hanya mencetak instruksinya.
Name, ID, dan Path adalah Tiga Hal Berbeda
use PandaPanel\Core\PanelManager;
$panel = app(PanelManager::class)->get('admin');
$panel->getId(); // 'admin'
$panel->getName(); // 'Admin'
$panel->getPath(); // 'admin'2
3
4
5
6
7
| Value | Sumber | Diubah melalui |
|---|---|---|
| id | PanelProvider::panelId(), class basename tanpa PanelProvider, kemudian kebab-case | rename provider class atau ->id() |
| name | ->name('Admin') | ubah call tersebut |
| path | ->path('admin') | ubah call tersebut / --path |
Contoh:
AdminPanelProvider
→ id: admin
BackOfficePanelProvider
→ id: back-office2
3
4
5
Panel id digunakan oleh:
panel:user --panel=
panel:plugins --panel=
route names2
3
ID berasal dari provider class, bukan URL path. Mengubah URL tidak otomatis mengubah Panel id.
Existing File Tidak Ditimpa
Jika file sudah ada:
WARN Skipped [app/Panels/Admin/AdminPanelProvider.php] because it already exists. Use --force to overwrite.--force menimpa file.
Tidak ada merge dan backup. Jika provider sudah Anda edit, seluruh isinya akan diganti. Commit perubahan sebelum menggunakan --force.
Custom Stubs
Generator pertama-tama mencari:
stubs/panel/panel-provider.stubmilik application.
Jika tidak ada, package stub digunakan.
Publish seluruh generator stubs:
php artisan vendor:publish --tag=panda-panel-stubsPlaceholder provider:
| Placeholder | Value |
|---|---|
{{ panel }} | Studly panel name, misalnya Admin |
{{ path }} | URL prefix dari --path atau kebab-case name |
Setelah stub dipublish, application copy selalu memiliki prioritas.
Ini berguna jika semua Panel project Anda selalu membutuhkan konfigurasi tambahan seperti:
brandName
navigation group
custom middleware2
3
Anda cukup mengubah stub sekali.
Exit Codes
| Hasil | Code |
|---|---|
| Provider berhasil dibuat | 0 |
| Provider sudah ada dan dilewati | 1 |
Provider ditimpa dengan --force | 0 |
Failure hanya terjadi ketika command diminta membuat file tetapi tidak menghasilkan file karena existing file dilewati.
Hal yang Perlu Diperhatikan
- Panel tidak terlihat sampai provider didaftarkan di config. Ini penyebab paling umum ketika generator dianggap "tidak bekerja".
--path=dengan value kosong benar-benar menghasilkan empty path. Default hanya berlaku jika option tidak diberikan sama sekali.- Cached manifest tidak menyembunyikan Panel yang benar-benar baru.
PanelManifest::for()fallback ke discovery jika id Panel belum ada di manifest. - Setelah Panel masuk ke manifest, class baru di bawah discovery path tidak terlihat sampai
php artisan panel:clear. - Dua Panel tidak boleh memiliki kombinasi path/domain yang sama. Registry menolak duplicate dengan
PanelRegistrationException::duplicatePanelPath(). - Generator tidak mengedit
config/panda-panel.php. Gunakanpanel:installjika ingin scaffold + registration dalam satu flow.