Route Cache
php artisan route:cache mengompilasi seluruh route table menjadi satu file lalu Laravel menggunakan file tersebut tanpa membangun ulang route dari provider pada setiap boot. Route PandaBear memang dirancang agar cacheable: semua route menunjuk ke controller method, tidak pernah Closure. Gunakan halaman ini saat menambahkan route cache ke deploy atau ketika URL Panel 404 di server tetapi bekerja di lokal.
Contoh minimal yang berfungsi
php artisan route:cache
php artisan route:list --path=admin2
Atau sebagai bagian dari optimasi lengkap:
php artisan optimize # config, routes, events, views — dan panel:cacheMengapa route PandaBear dapat dicache
route:cache menolak route table yang mengandung Closure karena Closure tidak serializable. PandaPanel\Routing\PanelRouteRegistrar tidak pernah mendaftarkan Closure:
$this->router->get('/', PanelDashboardController::class)->name('dashboard');
$this->router->post('read', [PanelNotificationController::class, 'read'])->name('read');
$this->router->get($page::routePath(), PanelPageController::class)->defaults('page', $page);2
3
Tiga bentuk tersebut semuanya serializable:
- invokable controller class;
[class, method]pair;- route default yang menyimpan class name string.
Resource Page diregistrasikan dengan pola yang sama:
$this->router->{$verb}($path, [$page, $method])->name($routeName);Jika route:cache gagal pada application Anda karena Closure, sumber Closure tersebut berada pada route application sendiri, bukan route yang dibuat PandaBear.
Apa yang diregistrasikan dan kapan
Service provider membuat satu route group per Panel saat boot():
// PandaPanelServiceProvider::registerRoutes()
if ($this->app->make('config')->get('panda-panel.register_routes') !== true) {
return;
}
$this->app->make(PanelRouteRegistrar::class)->registerAll();2
3
4
5
6
Group attributes:
$attributes = [
'prefix' => $panel->getPath(),
'as' => $panel->getRouteNamePrefix(), // 'panel.admin.'
'middleware' => [
...$panel->getMiddleware(),
ResolvePanel::class.':'.$panel->getId(),
RequireTwoFactor::class.':'.$panel->getId(),
RequireEmailCode::class.':'.$panel->getId(),
...($panel->hasTenancy() ? [ResolveTenant::class.':'.$panel->getId()] : []),
],
];2
3
4
5
6
7
8
9
10
11
| Method | Signature |
|---|---|
registerAll | registerAll(): void — seluruh registered Panel |
register | register(Panel $panel): void — satu Panel |
Panel id diberikan sebagai middleware parameter, bukan ditebak dari URL path. Dengan begitu dua Panel yang memiliki pola prefix mirip tidak ambigu, dan middleware string tetap dapat dicache seperti string lain.
Route name yang masuk cache
Seluruh route PandaBear diawali:
panel.{id}.Contoh:
panel('admin')->getRouteNamePrefix(); // 'panel.admin.'
panel('admin')->routeName('dashboard'); // 'panel.admin.dashboard'2
| Route name | Path | Diregistrasikan oleh |
|---|---|---|
panel.admin.dashboard | /admin | Panel |
panel.admin.search | /admin/search | global search |
panel.admin.options | /admin/options | searchable Select |
panel.admin.uploads | /admin/uploads | FileUpload |
panel.admin.form-state | /admin/form-state | live fields |
panel.admin.export-file | /admin/exports/{file} | finished exports |
panel.admin.import-file | /admin/imports/{file} | import failure reports |
panel.admin.notifications.index / .read / .clear | /admin/notifications… | Notification Centre |
panel.admin.auth.two-factor.* | /admin/two-factor/… | Email Code challenge |
panel.admin.actions.* | /admin/actions/… | Action endpoints |
panel.admin.relations.* | /admin/relations/… | Relation endpoints |
panel.admin.pages.{slug} | routePath() Page | standalone Page |
panel.admin.resources.{slug}.* | Resource slug | Resource Pages |
panel.admin.auth.login dan route auth lain | /admin/login dst | Panel yang mengaktifkan own auth pages |
Resource route name tetap menggunakan resources.{slug}. walaupun Cluster mengubah URL path. Karena itu Resource::url() tetap stabil sementara alamat browser dapat berpindah.
Urutan cache yang paling penting
Route table dibangun dari registry Panel. Registry sendiri berasal dari manifest jika tersedia atau discovery jika tidak.
Route cache kemudian membekukan hasil tersebut.
Cara paling aman:
php artisan optimizekarena route cache dan Panel cache dibangun dari code tree yang sama.
Jika dijalankan terpisah, keduanya tetap harus dibuild pada release yang sama:
| Kondisi | Gejala |
|---|---|
| Route cache baru, Panel manifest stale | URL dapat tersedia tetapi Resource tidak muncul sesuai registry/navigation baru |
| Route cache stale, Panel manifest baru | sidebar menampilkan link yang 404 karena route belum masuk compiled table |
Kedua kondisi dapat tidak menghasilkan log. Solusi umumnya adalah rebuild dengan optimize setelah release code siap.
Dampak route cache pada boot-time registration
Ketika compiled route table tersedia, Laravel menggunakan cached collection untuk request. Provider tetap dapat menjalankan registerAll() saat boot, tetapi route runtime yang melayani request berasal dari cache.
Dua implikasi:
- Resource baru memerlukan route cache rebuild, bukan hanya
panel:cache. - Route cache release lama dapat bertahan setelah code berubah jika deploy tidak membangunnya ulang.
Pada release-directory deployment, bootstrap/cache harus menjadi bagian dari release, bukan shared directory. Lihat Panel cache.
Memeriksa route table
php artisan route:list --path=admin
php artisan route:list --name=panel.admin.resources2
Programmatically:
use Illuminate\Support\Facades\Route;
Route::has('panel.admin.dashboard'); // true
route('panel.admin.dashboard', absolute: false); // '/admin'
route('panel.admin.resources.users.index', absolute: false); // '/admin/users'2
3
4
5
Untuk job, bangun route name melalui Panel object daripada menulis string manual:
use PandaPanel\Core\PanelManager;
$panel = app(PanelManager::class)->get('admin');
route(
$panel->routeName('export-file'),
['file' => $file, 'exporter' => $exporter],
absolute: false,
);2
3
4
5
6
7
8
9
absolute: false penting pada queued job karena APP_URL worker belum tentu sama dengan host yang sedang dibuka user. Relative URL tidak dapat salah memilih host.
Wayfinder
Frontend tidak seharusnya hard-code Panel URL. Module @/routes/* dan @/actions/* dihasilkan Wayfinder berdasarkan route table application:
php artisan wayfinder:generate
npm run build2
Generate ulang setelah route berubah. Resource baru dapat menambah route, sehingga generated TypeScript harus mengikuti. Stale generation sebaiknya gagal saat TypeScript/build, bukan menjadi broken link runtime.
Mematikan route registration bawaan
// config/panda-panel.php
'register_routes' => false,2
Ketika false, PandaBear tidak mendaftarkan route group otomatis. Application dapat mendaftarkannya sendiri:
use PandaPanel\Core\PanelManager;
use PandaPanel\Routing\PanelRouteRegistrar;
app(PanelRouteRegistrar::class)->register(
app(PanelManager::class)->get('admin')
);2
3
4
5
6
Use case ini ditujukan untuk harness tanpa HTTP atau application yang membutuhkan posisi route group khusus. Deploy normal tidak perlu mengubah setting tersebut.
Membersihkan route cache
php artisan route:clear
php artisan optimize:clear # config, routes, views, events — dan panel:clear2
Hal yang perlu diperhatikan
route:cachebukanpanel:cache. Keduanya berbeda;optimizemenjalankan keduanya.- Cached route table dapat bertahan melewati code deploy. Rebuild pada setiap release.
- Panel yang baru ditambahkan ke config setelah route cache dibuat tidak memiliki route sampai route cache dibangun ulang.
- Mengganti Panel id mengganti seluruh route name
panel.{id}.*. Wayfinder module dan manualroute()call yang memakai id lama juga harus di-update. - Nested Resource menambah parent segment. Parent yang tidak terdaftar pada Panel yang sama menghasilkan
PanelRegistrationExceptionsaat boot/cache daripada membuat dead link. - Resource dengan Integrations disabled tidak memiliki integration route. URL 404 daripada 403 karena memang tidak ada endpoint yang perlu diakses.