Named Routes di NexaUI Framework

Pengenalan

Named routes adalah fitur di NexaUI yang memungkinkan Anda untuk memberikan nama pada route, sehingga Anda dapat menghasilkan URL atau melakukan redirect ke route tersebut tanpa harus mengandalkan URL hardcoded. Ini membuat aplikasi Anda lebih mudah dipelihara karena perubahan pada URL tidak akan memengaruhi kode yang menggunakannya.

Mendefinisikan Named Routes

Untuk memberikan nama pada route, gunakan method name() pada definisi route:

// Route sederhana dengan nama
$router->get('users', 'UserController@index')->name('users.index');

// Route dengan parameter dan nama
$router->get('users/{id}', 'UserController@show')->name('users.show');

// Route POST dengan nama
$router->post('users', 'UserController@store')->name('users.store');

Konvensi penamaan yang umum digunakan adalah resource.action, seperti users.index, users.show, dll.

Menggunakan Named Routes

Menghasilkan URL

Anda dapat menghasilkan URL untuk named route menggunakan fungsi route():

// URL tanpa parameter
$url = route('users.index'); // Menghasilkan: /users

// URL dengan parameter
$url = route('users.show', ['id' => 1]); // Menghasilkan: /users/1

// URL dengan multiple parameters
$url = route('posts.comments.show', ['post' => 1, 'comment' => 2]); // Menghasilkan: /posts/1/comments/2

Redirect ke Named Route

Anda dapat melakukan redirect ke named route menggunakan method redirectToRoute():

// Redirect tanpa parameter
return $this->redirectToRoute('users.index');

// Redirect dengan parameter
return $this->redirectToRoute('users.show', ['id' => 1]);

// Redirect dengan flash message
return $this->redirectToRoute('users.index')->with('success', 'User created successfully!');

Atau menggunakan fungsi helper redirect():

return redirect()->route('users.index');
return redirect()->route('users.show', ['id' => 1]);

Menggunakan Named Routes di Views

Di dalam template, Anda dapat menggunakan fungsi route() untuk menghasilkan URL:

<!-- Link ke route -->
<a href="{route/users.index}">All Users</a>

<!-- Link ke route dengan parameter -->
<a href="{route/users.show id=user.id}">View User</a>

<!-- Form action -->
<form method="post" action="{route/users.store}">
    <!-- Form fields -->
</form>

Named Routes dengan Route Groups

Anda dapat menggunakan prefix nama route dengan route groups:

$router->group(['prefix' => 'admin', 'as' => 'admin.'], function ($router) {
    $router->get('dashboard', 'AdminController@dashboard')->name('dashboard');
    $router->get('users', 'AdminController@users')->name('users');
    $router->get('settings', 'AdminController@settings')->name('settings');
});

Route di atas akan memiliki nama:

  • admin.dashboard - URL: /admin/dashboard
  • admin.users - URL: /admin/users
  • admin.settings - URL: /admin/settings

Anda dapat menghasilkan URL untuk route tersebut seperti biasa:

$url = route('admin.dashboard'); // Menghasilkan: /admin/dashboard

Named Routes dengan Resource Controllers

Ketika Anda mendefinisikan resource controller, NexaUI secara otomatis memberikan nama pada setiap route:

$router->resource('users', 'UserController');

Ini akan menghasilkan route berikut dengan nama yang sesuai:

Method URI Action Route Name
GET /users index users.index
GET /users/create create users.create
POST /users store users.store
GET /users/{id} show users.show
GET /users/{id}/edit edit users.edit
PUT/PATCH /users/{id} update users.update
DELETE /users/{id} destroy users.destroy

Anda dapat menggunakan nama-nama ini untuk menghasilkan URL:

$indexUrl = route('users.index');
$createUrl = route('users.create');
$showUrl = route('users.show', ['id' => 1]);

Menyesuaikan Nama Resource

Anda dapat menyesuaikan nama route resource:

$router->resource('users', 'UserController', ['names' => [
    'index' => 'admin.users',
    'create' => 'admin.users.build',
    'store' => 'admin.users.save',
    'show' => 'admin.users.view',
    'edit' => 'admin.users.modify',
    'update' => 'admin.users.amend',
    'destroy' => 'admin.users.remove',
]]);

Memeriksa Route Saat Ini

Anda dapat memeriksa apakah route saat ini cocok dengan nama tertentu menggunakan method isRoute():

// Di controller
if ($this->isRoute('users.show')) {
    // Logic khusus untuk route users.show
}

// Dengan parameter
if ($this->isRoute('users.show', ['id' => 1])) {
    // Logic khusus untuk route users.show dengan id=1
}

Di template, Anda dapat menggunakan helper is_route():

<!-- Menambahkan class active jika route saat ini adalah users.index -->
<a href="{route/users.index}" class="">All Users</a>

<!-- Menambahkan class active jika route saat ini adalah users.show dengan id tertentu -->
<a href="{route/users.show id=user.id}" class="">View User</a>

Route URL Generation dengan Parameter Tambahan

Anda dapat menambahkan parameter query string tambahan saat menghasilkan URL:

// URL dengan query string
$url = route('users.index', ['sort' => 'name', 'direction' => 'asc']);
// Menghasilkan: /users?sort=name&direction=asc

// URL dengan parameter route dan query string
$url = route('users.show', ['id' => 1, 'tab' => 'profile']);
// Menghasilkan: /users/1?tab=profile

Signed URLs

NexaUI mendukung signed URLs, yang berguna untuk membuat URL yang tidak dapat diubah:

// Menghasilkan signed URL
$url = route('users.verify', ['id' => 1])->signed();
// Menghasilkan: /users/verify/1?signature=eyJpdiI6IlhYWFg...

// Menghasilkan signed URL dengan waktu kedaluwarsa
$url = route('users.verify', ['id' => 1])->signedExpires(now()->addHours(24));
// Menghasilkan: /users/verify/1?expires=1234567890&signature=eyJpdiI6IlhYWFg...

Di controller, Anda dapat memverifikasi apakah request memiliki signature yang valid:

public function verify(Request $request, $id)
{
    if (!$request->hasValidSignature()) {
        abort(403, 'URL signature is invalid');
    }
    
    // Proses verifikasi
}

Absolute URLs

Secara default, fungsi route() menghasilkan URL relatif. Untuk menghasilkan URL absolut, gunakan method absolute():

// URL relatif
$url = route('users.index'); // Menghasilkan: /users

// URL absolut
$url = route('users.index')->absolute(); // Menghasilkan: https://example.com/users

Route Caching

Untuk meningkatkan performa, NexaUI mendukung route caching. Ini sangat berguna untuk aplikasi dengan banyak route:

// Cache route
php nexa route:cache

// Clear route cache
php nexa route:clear

Perhatikan bahwa route cache hanya bekerja jika semua route Anda menggunakan controller class, bukan closure.

Praktik Terbaik

  • Gunakan Konvensi Penamaan yang Konsisten - Gunakan format resource.action untuk memudahkan pemahaman dan pemeliharaan.
  • Hindari Hardcoding URL - Selalu gunakan named routes daripada hardcoding URL dalam kode Anda.
  • Dokumentasikan Route - Buat dokumentasi atau komentar untuk route yang kompleks atau tidak jelas.
  • Gunakan Route Groups - Kelompokkan route terkait dan gunakan prefix nama untuk menghindari konflik nama.
  • Pertimbangkan SEO - Buat nama route yang mencerminkan struktur URL yang SEO-friendly.

Kesimpulan

Named routes adalah fitur yang powerful di NexaUI yang membantu Anda menghasilkan URL dan melakukan redirect tanpa hardcoding URL. Ini membuat aplikasi Anda lebih mudah dipelihara dan lebih fleksibel terhadap perubahan struktur URL.

Dengan menggunakan named routes secara konsisten di seluruh aplikasi, Anda dapat mengubah struktur URL tanpa harus mengubah kode yang menggunakannya, yang sangat berguna untuk refactoring dan pengembangan jangka panjang.