Redirect Home
User yang sudah login dan membuka /dashboard bawaan starter kit akan diarahkan ke Panel pertama yang boleh mereka akses. Ini adalah satu-satunya behavior instalasi package yang mengambil alih response dari screen yang sebelumnya sudah dimiliki application, dan behavior tersebut dapat dikembalikan hanya dengan dua baris konfigurasi.
Gunakan halaman ini ketika /dashboard memang merupakan Page application yang ingin Anda pertahankan, atau ketika Anda ingin menyerahkan path lain ke Panel.
Contoh minimal yang berfungsi
// config/panda-panel.php
'home_redirect' => [
'enabled' => true,
'paths' => ['dashboard'],
],2
3
4
5
6
7
$this->actingAs($admin)->get('/dashboard')->assertRedirect('/admin');Jika ingin mempertahankan dashboard application sendiri:
'home_redirect' => [
'enabled' => false,
'paths' => ['dashboard'],
],2
3
4
5
$this->actingAs($admin)->get('/dashboard')->assertOk();Mengapa feature ini ada
Laravel Vue starter kit menyediakan route /dashboard dengan placeholder Page dan mengarahkan post-login Fortify ke sana. Menginstall PandaBear tidak mengubah route atau redirect Fortify tersebut. Tanpa helper ini, screen pertama setelah login tetap berupa placeholder starter kit, sementara URL Panel harus diketahui sendiri oleh developer/user.
Package tidak menulis ulang route untuk mengatasinya. Application tetap memiliki:
- route
/dashboard; - route name;
- Page component.
Request yang menuju path tersebut hanya dijawab lebih awal oleh middleware. Jika feature dimatikan, ketiga hal tersebut kembali berfungsi seperti sebelumnya.
php artisan panel:install juga memberi tahu developer bahwa redirect ini diaktifkan. Redirect yang terjadi diam-diam akan sangat sulit dipahami saat setup pertama.
Config key
| Key | Type | Default | Behavior |
|---|---|---|---|
home_redirect.enabled | bool | true | Value selain boolean true mematikan seluruh feature. |
home_redirect.paths | list<string> | ['dashboard'] | Pattern Request::is(). Entry non-string dan empty dibuang; list kosong menonaktifkan feature. |
'paths' => ['dashboard', 'reports/*'],Value menggunakan pattern, bukan literal route, sehingga satu section application dapat diserahkan sekaligus. Pattern dibandingkan terhadap path tanpa leading slash, sesuai behavior $request->is().
PandaPanel\Support\PanelHomeRedirect
public static function for(Request $request): ?stringMethod ini mengembalikan URL tujuan redirect, atau null jika request seharusnya dibiarkan seperti biasa.
Lima kondisi menghasilkan null:
| Kondisi | Alasan |
|---|---|
Feature dimatikan atau paths kosong | Tidak ada path yang diambil alih. |
| Request tidak cocok dengan pattern mana pun | Route lain tetap milik application. |
| Request sudah berada di dalam Panel | Panel menangani URL-nya sendiri; redirect lagi dapat menimbulkan loop. |
| Tidak ada Panel yang mengizinkan user ini | Guest atau user yang ditolak oleh seluruh canAccess(). |
Route dashboard milik Panel tidak tersedia | register_routes dimatikan sehingga tidak ada destination. |
use Illuminate\Http\Request;
use PandaPanel\Support\PanelHomeRedirect;
$request = Request::create('/dashboard');
$request->setUserResolver(static fn () => $admin);
PanelHomeRedirect::for($request); // '/admin'2
3
4
5
6
7
URL yang dihasilkan bersifat relative melalui route($route, absolute: false). Tujuannya merupakan Page di application yang sama, sehingga relative target memungkinkan Inertia mengikuti navigation tersebut tanpa full page reload.
Panel yang dianggap "pertama" ditentukan oleh:
PanelManager::firstAccessibleTo()Method tersebut berjalan melalui PanelRegistry::all(), yang diurutkan berdasarkan Panel id, lalu memilih Panel pertama yang isAccessibleTo()-nya menghasilkan true.
Jadi urutan di config/panda-panel.php tidak menentukan destination. Id-lah yang menentukan prioritas. Konsekuensinya, mengganti id Panel dapat mengubah Panel pertama yang menjadi landing Page user.
use PandaPanel\Facades\PandaPanel;
PandaPanel::firstAccessibleTo($user); // Panel|null2
3
PandaPanel\Http\Middleware\RedirectPanelHome
public function handle(Request $request, Closure $next): ResponseService Provider menambahkan middleware ini ke group web.
if (! $request->isMethod('GET') || $request->expectsJson()) {
return $next($request);
}
$target = PanelHomeRedirect::for($request);
return $target === null
? $next($request)
: redirect()->to($target);2
3
4
5
6
7
8
9
Middleware hanya bekerja untuk GET dan tidak pernah mengambil alih request yang mengharapkan JSON.
Alasannya, starter-kit dashboard adalah screen. Jika application secara kebetulan memiliki API atau form POST pada path yang sama, behavior tersebut harus tetap milik application.
Response menggunakan ordinary 302, bukan Inertia location visit. Karena destination berada di application yang sama, Inertia request dapat mengikuti redirect tersebut dan merender Panel tanpa full reload.
Feature ini dibuat sebagai middleware, bukan route yang bersaing dengan /dashboard, karena /dashboard adalah route milik application. Jika package ikut mendaftarkan URI yang sama, hasilnya akan bergantung pada urutan registration route.
Contoh kasus
Masing-masing contoh berikut juga direpresentasikan di test suite package.
// An admin lands in the admin panel.
$this->actingAs(User::factory()->admin()->create())
->get('/dashboard')
->assertRedirect('/admin');
// A member fails the admin panel's access check, so they get the next one they can enter.
$this->actingAs(User::factory()->create())
->get('/dashboard')
->assertRedirect('/app');
// A guest is the application's business: /dashboard is behind `auth`.
$this->get('/dashboard')->assertRedirect(route('login'));
// Every other route is untouched.
$this->actingAs($admin)->get('/')->assertOk();
// A request that wants JSON is untouched.
$this->actingAs($admin)->getJson('/dashboard')->assertOk();2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Menyerahkan section lain:
use Illuminate\Support\Facades\Config;
Config::set('panda-panel.home_redirect.paths', ['reports/*']);
$this->actingAs($admin)->get('/dashboard')->assertOk(); // no longer taken over2
3
4
5
Jika sebuah Panel sendiri dipasang pada path yang cocok dengan pattern, path tersebut sengaja diabaikan agar tidak terjadi redirect loop:
Config::set('panda-panel.home_redirect.paths', ['admin', 'admin/*']);
$this->actingAs($admin)->get('/admin')->assertOk();2
3
Mematikan behavior
Ada tiga cara, dari yang paling direkomendasikan:
// 1. The config key. Reverses everything, keeps the middleware harmless.
'home_redirect' => ['enabled' => false, 'paths' => ['dashboard']],2
// 2. Narrow the paths to a section you do want handed over.
'home_redirect' => ['enabled' => true, 'paths' => ['reports/*']],2
// 3. Drop the middleware entirely, by taking over web middleware registration.
'register_web_middleware' => false,2
Cara ketiga juga menghilangkan:
ResetPanelContext;ShareFlashToast;SharePanelData.
Anda kemudian harus mendaftarkannya sendiri. Lihat Middleware Registration.
Jika hanya ingin mematikan Home Redirect, gunakan home_redirect.enabled = false; tidak perlu mengambil alih seluruh middleware registration.
Hal yang perlu diperhatikan
enableddibandingkan dengan!== true. String dari environment variable akan menonaktifkan feature, termasuk string'true'.- Pattern tidak menggunakan leading slash.
'/dashboard'tidak cocok;$request->is()membandingkan trimmed path. - Feature ini bukan post-login redirect milik Fortify. Fortify tetap mengirim user ke destination
HOME/LoginResponseyang dikonfigurasi. Middleware ini hanya menangkap request ketika user kemudian sampai di/dashboard. - User yang tidak boleh masuk ke Panel mana pun tetap melihat Page application sendiri. Tidak ada error dan tidak ada 403 karena redirect simply tidak terjadi.
register_routes => falsesecara praktis mematikan feature ini. Tanpa routepanel.{id}.dashboard, resolver tidak memiliki destination dan mengembalikannull.- Redirect berjalan pada setiap GET yang cocok, bukan hanya segera setelah login. User yang kembali membuka atau membookmark
/dashboardjuga akan diarahkan ke Panel.