Registrasi Middleware
Package mendaftarkan empat middleware ke seluruh group web dan empat middleware alias. Keduanya didaftarkan dari PandaPanel\PandaPanelServiceProvider::registerMiddleware().
Satu config key menentukan apakah empat middleware pada group web ditambahkan secara otomatis.
Gunakan halaman ini ketika Anda perlu:
- menempatkan middleware tersebut pada posisi tertentu di middleware stack;
- mengambil alih registrasi middleware secara manual;
- atau mencari tahu mengapa salah satu middleware PandaBear tidak berjalan.
Contoh minimal yang berfungsi
// config/panda-panel.php
'register_web_middleware' => true,2
3
Itu adalah default. Dengan konfigurasi tersebut, cukup menginstall package; Anda tidak perlu mengedit bootstrap/app.php dan tidak ada langkah tambahan yang dapat terlupakan.
Untuk memeriksa hasil registration:
use Illuminate\Contracts\Http\Kernel;
app(Kernel::class)->getMiddlewareGroups()['web'];
// [..., ResetPanelContext::class, RedirectPanelHome::class, ShareFlashToast::class, SharePanelData::class]2
3
4
Empat middleware pada group web
Middleware ditambahkan dalam urutan berikut, dan urutan tersebut memang diperlukan:
| Class | Peran |
|---|---|
PandaPanel\Http\Middleware\ResetPanelContext | Menghapus Panel yang sebelumnya tersimpan pada awal setiap request. |
PandaPanel\Http\Middleware\RedirectPanelHome | Mengarahkan signed-in user yang membuka /dashboard starter kit ke Panel. |
PandaPanel\Http\Middleware\ShareFlashToast | Memetakan Laravel flash key ke satu toast channel yang dibaca frontend. |
PandaPanel\Http\Middleware\SharePanelData | Membagikan props yang dibutuhkan setiap screen Panel. |
Keempatnya sengaja tidak ditempatkan di Panel route group. Masing-masing memiliki alasan tersendiri.
ResetPanelContext
public function handle(Request $request, Closure $next): ResponseResolvePanel hanya berjalan di dalam Panel route group. Tanpa ResetPanelContext, request non-Panel dapat mempertahankan value yang ditinggalkan request sebelumnya di PandaPanel\Support\PanelContext.
Pada request PHP klasik, container dibuat ulang setiap request sehingga kebocoran state tersebut sulit terlihat. Namun pada Octane atau test yang membuat beberapa HTTP request dalam satu process, kebocoran tersebut nyata.
Menjalankan middleware ini paling awal memastikan invariant berikut selalu benar:
Di luar request Panel, tidak boleh ada current Panel.
Behavior ini tidak bergantung pada kebetulan lifecycle PHP process.
RedirectPanelHome
public function handle(Request $request, Closure $next): ResponseMiddleware hanya bekerja untuk GET dan tidak mengambil alih request yang mengharapkan JSON.
Ia menangani /dashboard, yaitu route milik application, sebelum application memberikan response. Karena itu implementasinya berupa middleware, bukan route PandaBear yang bersaing dengan route application.
Middleware ini dijalankan sebelum dua middleware sharing di bawahnya. Jika request akan langsung di-redirect, tidak ada alasan menghitung props untuk Page Panel yang tidak akan pernah dirender.
Detail behavior redirect dan cara mematikannya ada di Home Redirect.
ShareFlashToast
public function handle(Request $request, Closure $next): ResponseMiddleware membaca flash key dari session dalam urutan:
error
warning
success
info2
3
4
Urutan tersebut mengutamakan severity. Jika sebuah request secara tidak sengaja memiliki flash error dan success sekaligus, error akan ditampilkan lebih dahulu.
Value non-empty pertama diteruskan sebagai:
Inertia::flash('toast', [
'type' => …,
'message' => …,
]);2
3
4
Request tanpa session dilewatkan tanpa perubahan.
Jika application sudah secara eksplisit mengatur:
Inertia::flash('toast', …)value tersebut tidak ditimpa.
Middleware ini harus berada di group web, bukan hanya Panel group, karena toast juga harus tetap tersedia pada redirect yang keluar dari Panel menuju route application.
return redirect()
->route('panel.admin.resources.users.index')
->with('success', 'User created.');2
3
SharePanelData
public function handle(Request $request, Closure $next): ResponseMiddleware membagikan tujuh prop melalui Inertia::share().
Inertia::share() melakukan merge, sehingga shared props milik application melalui HandleInertiaRequests tetap tersedia. Prop seperti:
auth
errors2
tidak dihapus atau diganti.
| Prop | Bentuk |
|---|---|
panel | Panel::toSharedArray(), atau null di luar Panel |
navigation | Tree sidebar untuk current Panel; empty di luar Panel |
panels | Daftar Panel yang dapat diakses user, digunakan Panel switcher |
broadcasting | {enabled, channel} — Panel dan application sama-sama harus mendukung broadcasting |
search | {enabled, url, debounce, keyBindings} |
notifications | {enabled, indexUrl, readUrl, clearUrl, unread} |
tenancy | {current, available}, atau null jika Panel tidak menggunakan tenancy |
Semua value dibungkus Closure. Request yang tidak pernah mencapai Panel tidak membayar biaya untuk menghitung data tersebut.
Data ini juga tidak di-cache karena banyak value bersifat request/user-specific:
- visibility;
- badge count;
- active navigation state;
- unread notification count.
Sharing ini ditempatkan di package, bukan meminta setiap application menyalinnya ke HandleInertiaRequests. Jika versi PandaBear baru menambahkan prop baru, application lama tetap menerima prop tersebut tanpa perlu memperbarui middleware application secara manual.
Lihat Server Metadata to Vue.
Bagaimana middleware ditambahkan
Middleware ditambahkan melalui HTTP Kernel, bukan langsung ke Router, dan dilakukan setelah Kernel di-resolve:
$append = static function (mixed $kernel): void {
if (! method_exists($kernel, 'appendMiddlewareToGroup')) {
return;
}
foreach (self::WEB_MIDDLEWARE as $middleware) {
$kernel->appendMiddlewareToGroup('web', $middleware);
}
};
if ($this->app->resolved(Kernel::class)) {
$append($this->app->make(Kernel::class));
}
$this->app->afterResolving(Kernel::class, $append);2
3
4
5
6
7
8
9
10
11
12
13
14
15
bootstrap/app.php mengkonfigurasi group web dari hook afterResolving(Kernel::class) milik withMiddleware(). Hook tersebut kemudian menjalankan:
$kernel->setMiddlewareGroups(...)yang dapat mengganti group middleware yang sebelumnya tersimpan.
Jika package mendorong middleware langsung ke Router terlalu awal, middleware tersebut dapat hilang ketika Kernel selesai dibangun.
Karena itu PandaBear mendaftarkan hook setelah hook Laravel. Branch yang langsung memanggil $append() menangani kasus ketika Kernel sudah terlanjur di-resolve, misalnya pada test yang membangun application lebih dahulu.
appendMiddlewareToGroup() bersifat idempotent. Provider yang ter-boot dua kali tidak menghasilkan middleware duplicate.
Mematikan registrasi otomatis
// config/panda-panel.php
'register_web_middleware' => false,2
3
Value dibandingkan dengan !== true, sehingga hanya boolean true yang mengaktifkan registration.
Jika dimatikan, daftarkan sendiri dengan urutan yang tetap mempertahankan requirement di atas:
// bootstrap/app.php
use Illuminate\Foundation\Configuration\Middleware;
use PandaPanel\Http\Middleware\RedirectPanelHome;
use PandaPanel\Http\Middleware\ResetPanelContext;
use PandaPanel\Http\Middleware\ShareFlashToast;
use PandaPanel\Http\Middleware\SharePanelData;
->withMiddleware(function (Middleware $middleware): void {
$middleware->web(append: [
ResetPanelContext::class,
RedirectPanelHome::class,
ShareFlashToast::class,
SharePanelData::class,
]);
})2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Ini merupakan pilihan yang tepat ketika Anda membutuhkan posisi middleware tertentu, misalnya:
SharePanelDataharus berada sebelum custom Inertia middleware;ResetPanelContextharus berjalan sebelum middleware application yang membaca Panel Context.
Namun mematikan automatic registration bukan berarti middleware tersebut boleh dihilangkan seluruhnya.
Tanpa SharePanelData, Panel Page dapat tetap memberi HTTP 200 tetapi shell tidak menerima data penting seperti:
- navigation;
- Panel switcher;
- notification state.
Menghilangkan hanya RedirectPanelHome merupakan arrangement yang valid. Cara lebih sederhana adalah tetap menggunakan middleware dan mematikan Home Redirect dari config.
Middleware alias
Empat alias selalu diregistrasikan, bahkan sebelum register_web_middleware dibaca.
Jadi mematikan automatic web middleware tidak menghapus alias berikut:
| Alias | Class |
|---|---|
panel | PandaPanel\Http\Middleware\ResolvePanel |
panel.two-factor | PandaPanel\Http\Middleware\RequireTwoFactor |
panel.email-code | PandaPanel\Http\Middleware\RequireEmailCode |
panel.parent | PandaPanel\Http\Middleware\ResolveParentRecord |
use Illuminate\Support\Facades\Route;
Route::get('/reports/export', ExportController::class)->middleware('panel:admin');2
3
Alias disediakan agar application dapat mereferensikan middleware PandaBear pada route miliknya sendiri.
Panel route registrar sendiri menggunakan class langsung, bukan alias. Karena itu perubahan alias tidak merusak route Panel yang diregistrasikan framework.
Sebagian besar middleware menerima optional Panel id.
ResolvePanel tanpa Panel id fallback ke:
PanelManager::resolveFromRequest()Behavior tersebut memungkinkan alias panel digunakan di luar Panel group.
ResolveParentRecord berbeda: parameter yang diterimanya adalah class nested Resource, bukan Panel id, dan parameter tersebut wajib ada.
Middleware yang tidak didaftarkan di sini
Middleware berikut dipasang langsung oleh PandaPanel\Routing\PanelRouteRegistrar pada masing-masing Panel route group:
ResolvePanel;RequireTwoFactor;RequireEmailCode;ResolveTenant.
Panel id diteruskan sebagai parameter middleware.
Keempatnya bukan bagian dari group web, sehingga tidak dipengaruhi oleh config register_web_middleware.
Lihat Route Registration dan Middleware and Guards.
Hal yang perlu diperhatikan
- Urutannya bukan alphabetical dan bukan bebas.
ResetPanelContextharus berjalan sebelum code lain membaca Panel Context.RedirectPanelHomeharus berjalan sebelumSharePanelDataagar request yang akan di-redirect tidak menghitung props yang tidak pernah digunakan. register_web_middleware => falsetanpa registration manual menghasilkan Panel yang tidak lengkap. Gejalanya dapat berupa shell tanpa sidebar, bukan exception yang jelas.- Middleware ini hanya ada pada group
web. Panel yangmiddleware()-nya tidak menyertakanwebtidak mendapatkan middleware ini dan juga tidak memiliki session. Lihat Middleware and Guards. - Route non-
webtidak otomatis mendapatkanResetPanelContext. Jika API route me-resolve Panel secara manual, route tersebut harus mengelola context sendiri atau menerima state apa pun yang tersisa pada process. ShareFlashToastmembutuhkan session. Flash yang dibuat dari stateless API route tidak akan muncul sebagai Panel toast.