panel:cache
Menjalankan discovery satu kali lalu menulis hasilnya ke manifest, sehingga discovery tidak perlu dijalankan pada setiap request.
Gunakan command ini pada setiap production deploy, dan jangan menjadikannya workflow development.
php artisan panel:cacheOutput:
INFO Panels cached: 2 panels, 1 resources, 5 pages, 4 widgets.Signature
panel:cacheTidak ada argument maupun option.
Command selalu meng-cache seluruh Panel yang terdaftar. Manifest yang hanya mencakup sebagian Panel akan membingungkan karena tidak ada cara mudah membedakan "tidak dicache" dengan "Panel memang tidak menemukan apa pun".
Handler:
// PandaPanel\Console\Commands\CachePanelsCommand
public function handle(PandaPanel\Cache\PanelManifest $manifest, PandaPanel\Core\PanelRegistry $registry): int2
File yang Ditulis
Manifest disimpan di:
bootstrap/cache/panels.phpmelalui:
PandaPanel\Cache\PanelManifest::path()Contoh:
<?php
// Generated by "php artisan panel:cache". Do not edit.
return array (
'panels' =>
array (
'admin' =>
array (
'resources' =>
array (
0 => 'App\\Panels\\Admin\\Resources\\Users\\UserResource',
),
'pages' => array ( /* ... */ ),
'widgets' => array ( /* ... */ ),
),
),
'fingerprint' => '…',
);2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Manifest hanya menyimpan class name.
Tidak menyimpan:
- Closure;
- resolved metadata;
- authorization result;
- user-specific data.
Test suite memastikan file hasil render tidak mengandung Closure atau function.
List per Panel merupakan gabungan explicit registration + discovery, kemudian:
- deduplicated;
- sorted.
Hasilnya dua run di dua machine dapat menghasilkan file yang byte-identical.
Path menggunakan application bootstrapPath(), bukan hard-coded base_path('bootstrap/...'), karena application dapat memindahkan bootstrap directory. Cache harus berada di lokasi yang juga dikenali optimize:clear.
Bagian dari optimize
panel:cache dan panel:clear diregistrasikan sebagai optimize hooks dengan key panels.
php artisan optimize
php artisan optimize:clear2
Dengan begitu:
php artisan optimizejuga menjalankan Panel cache, sedangkan:
php artisan optimize:clearmembersihkannya.
Jika deployment script Anda sudah menjalankan php artisan optimize, tidak diperlukan line tambahan khusus panel:cache.
Urutan dalam Deployment
Contoh:
composer install --no-dev --optimize-autoloader
php artisan optimize
npm ci && npm run build2
3
panel:cache harus dijalankan setelah composer install.
Discovery me-resolve file melalui Composer PSR-4 map. Manifest yang dibuat menggunakan autoloader lama dapat menunjuk class yang sudah pindah atau tidak lagi tersedia.
Membaca Manifest dari Code
PandaPanel\Cache\PanelManifest adalah singleton container dan menjadi satu-satunya reader/writer untuk file tersebut.
| Method | Signature |
|---|---|
path | static path(): string |
exists | exists(): bool |
for | for(Panel $panel): array{resources: list<string>, pages: list<string>, widgets: list<string>} |
write | write(PanelRegistry $registry): array |
clear | clear(): bool |
warnIfStale | warnIfStale(PanelRegistry $registry): void |
Contoh:
use PandaPanel\Cache\PanelManifest;
use PandaPanel\Core\PanelManager;
$manifest = app(PanelManifest::class);
$manifest->exists();
PanelManifest::path();
// '/app/bootstrap/cache/panels.php'
$manifest->for(
app(PanelManager::class)->get('admin')
);2
3
4
5
6
7
8
9
10
11
12
13
write() mengembalikan array yang sama dengan yang ditulis, sehingga command/test dapat melakukan assertion tanpa membaca file kembali.
Penulisan dilakukan ke temporary file:
panels.php.{pid}.tmpkemudian dipindahkan ke lokasi akhir. Dengan demikian:
- file setengah tertulis tidak pernah dibaca;
- dua proses cache bersamaan tidak saling mencampur isi.
for() menjadi seam yang dilewati setiap Panel saat registration.
Jika Panel ada di manifest, data dari manifest digunakan.
Jika Panel belum ada di manifest — misalnya Panel khusus test atau Panel baru setelah cache dibuat — hanya Panel tersebut yang fallback ke discovery.
Warning Cache Kedaluwarsa
Caching mempercepat runtime, tetapi ada konsekuensinya:
Resource/Page/Widget yang ditambahkan setelah
panel:cachetidak masuk ke Panel.
Gejalanya:
- tidak ada route;
- tidak ada navigation entry;
- tidak ada error.
PanelManifest::warnIfStale() berjalan satu kali pada akhir provider boot.
Warning hanya aktif jika:
- manifest ada;
- environment
localatautesting; - atau debug mode aktif.
Jika discovery fingerprint sudah berbeda:
[panel] The cached panel manifest is out of date: the classes under the
discovery paths have changed since `php artisan panel:cache` last ran. Until
you run `php artisan panel:clear`, anything added since then is invisible — no
route, no navigation entry, and no error to say so.2
3
4
Production tidak menampilkan warning ini karena production deployment memang diharapkan membangun cache setelah code selesai dipasang.
Exit Code
Selalu:
0Discovery yang menghasilkan zero class masih merupakan hasil valid untuk Panel yang belum memiliki Resource/Page/Widget.
Hal yang Perlu Diperhatikan
- Jangan cache di development. Class yang Anda tambahkan setelah cache dibuat menjadi tidak terlihat. Jika pernah menjalankan
optimizesecara lokal, jalankanoptimize:clear. - Command ini tidak melakukan route caching.
route:cachetetap terpisah. Panel routes aman di-cache karena menggunakan controller methods, bukan Closure. - Tidak ada user-specific data yang dicache. Authorization, active navigation, badge values, dan record data dihitung ulang per request.
- Manifest menggunakan Panel id sebagai key. Rename Panel membuat entry lama tidak lagi digunakan dan Panel tersebut fallback ke discovery sampai cache dibangun ulang.
- Malformed manifest dianggap kosong. Framework fallback ke discovery; lebih lambat tetapi tetap benar.
- Pada Octane, worker yang sudah memuat manifest akan tetap memakainya sampai direcycle. Deployment perlu restart workers.