Route Groups di NexaUI Framework

Pengenalan

Route Groups adalah fitur di NexaUI yang memungkinkan Anda untuk mengelompokkan beberapa route yang berbagi atribut yang sama, seperti prefix URL, middleware, namespace controller, atau nama route. Ini membantu mengurangi duplikasi kode dan membuat manajemen route lebih terstruktur.

Dasar Route Groups

Route groups dibuat menggunakan method group() pada objek router. Method ini menerima dua parameter: array atribut dan closure yang berisi definisi route.

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

Dalam contoh di atas, semua route dalam grup akan memiliki prefix URL /admin, sehingga URL lengkapnya akan menjadi:

  • /admin/dashboard
  • /admin/users
  • /admin/settings

Atribut Route Groups

Prefix URL

Prefix URL menambahkan awalan ke semua route dalam grup:

$router->group(['prefix' => 'api/v1'], function ($router) {
    $router->get('users', 'ApiController@getUsers');
    $router->post('users', 'ApiController@createUser');
    $router->get('posts', 'ApiController@getPosts');
});

Route di atas akan menghasilkan URL:

  • /api/v1/users (GET)
  • /api/v1/users (POST)
  • /api/v1/posts (GET)

Middleware

Middleware dapat diterapkan ke semua route dalam grup:

$router->group(['middleware' => 'auth'], function ($router) {
    $router->get('dashboard', 'DashboardController@index');
    $router->get('profile', 'ProfileController@show');
    $router->post('profile', 'ProfileController@update');
});

Anda juga dapat menerapkan beberapa middleware:

$router->group(['middleware' => ['auth', 'verified']], function ($router) {
    // Route definitions...
});

Namespace Controller

Namespace memungkinkan Anda untuk menentukan namespace controller untuk semua route dalam grup:

$router->group(['namespace' => 'Admin'], function ($router) {
    // Controller akan menggunakan namespace 'App\Controllers\Admin'
    $router->get('dashboard', 'DashboardController@index');
    $router->get('users', 'UserController@index');
});

Dalam contoh di atas, controller yang digunakan adalah:

  • App\Controllers\Admin\DashboardController
  • App\Controllers\Admin\UserController

Name Prefix

Name prefix menambahkan awalan ke nama semua route dalam grup:

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

Route di atas akan memiliki nama:

  • admin.dashboard
  • admin.users

Domain

Anda dapat mengelompokkan route berdasarkan subdomain:

$router->group(['domain' => 'api.example.com'], function ($router) {
    $router->get('users', 'ApiController@getUsers');
    $router->get('posts', 'ApiController@getPosts');
});

Route di atas hanya akan merespons request ke api.example.com.

Parameter Domain

Anda juga dapat menggunakan parameter dalam domain:

$router->group(['domain' => '{account}.example.com'], function ($router) {
    $router->get('dashboard', function ($account) {
        return 'Dashboard for ' . $account;
    });
    
    $router->get('users', function ($account) {
        return 'Users for ' . $account;
    });
});

Nested Route Groups

Anda dapat membuat grup route bersarang untuk menggabungkan beberapa atribut:

$router->group(['prefix' => 'api', 'middleware' => 'api'], function ($router) {
    
    // Grup untuk API v1
    $router->group(['prefix' => 'v1', 'namespace' => 'Api\V1'], function ($router) {
        $router->get('users', 'UserController@index');
        $router->get('posts', 'PostController@index');
    });
    
    // Grup untuk API v2
    $router->group(['prefix' => 'v2', 'namespace' => 'Api\V2'], function ($router) {
        $router->get('users', 'UserController@index');
        $router->get('posts', 'PostController@index');
    });
    
});

Route di atas akan menghasilkan URL:

  • /api/v1/users - Handled oleh App\Controllers\Api\V1\UserController@index
  • /api/v1/posts - Handled oleh App\Controllers\Api\V1\PostController@index
  • /api/v2/users - Handled oleh App\Controllers\Api\V2\UserController@index
  • /api/v2/posts - Handled oleh App\Controllers\Api\V2\PostController@index

Route Groups dengan Middleware Spesifik

Anda dapat menggabungkan route groups dengan middleware yang berbeda:

// Routes untuk guest users
$router->group(['middleware' => 'guest'], function ($router) {
    $router->get('login', 'AuthController@showLoginForm');
    $router->post('login', 'AuthController@login');
    $router->get('register', 'AuthController@showRegistrationForm');
    $router->post('register', 'AuthController@register');
});

// Routes untuk authenticated users
$router->group(['middleware' => 'auth'], function ($router) {
    $router->get('dashboard', 'DashboardController@index');
    $router->get('profile', 'ProfileController@show');
    
    // Routes untuk admin users
    $router->group(['middleware' => 'admin', '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 Groups untuk API Versioning

Route groups sangat berguna untuk versioning API:

// API v1
$router->group(['prefix' => 'api/v1', 'namespace' => 'Api\V1'], function ($router) {
    $router->get('users', 'UserController@index');
    $router->get('users/{id}', 'UserController@show');
    $router->post('users', 'UserController@store');
    
    $router->get('posts', 'PostController@index');
    $router->get('posts/{id}', 'PostController@show');
});

// API v2 dengan fitur tambahan
$router->group(['prefix' => 'api/v2', 'namespace' => 'Api\V2'], function ($router) {
    $router->get('users', 'UserController@index');
    $router->get('users/{id}', 'UserController@show');
    $router->post('users', 'UserController@store');
    $router->put('users/{id}', 'UserController@update');
    $router->delete('users/{id}', 'UserController@destroy');
    
    $router->get('posts', 'PostController@index');
    $router->get('posts/{id}', 'PostController@show');
    $router->post('posts', 'PostController@store');
});

Route Groups untuk Localization

Route groups dapat digunakan untuk menangani multiple languages:

$supportedLocales = ['en', 'id', 'fr'];

foreach ($supportedLocales as $locale) {
    $router->group(['prefix' => $locale], function ($router) use ($locale) {
        // Set application locale
        app()->setLocale($locale);
        
        $router->get('/', 'HomeController@index');
        $router->get('about', 'PageController@about');
        $router->get('contact', 'PageController@contact');
    });
}

Route di atas akan menghasilkan URL:

  • /en, /en/about, /en/contact
  • /id, /id/about, /id/contact
  • /fr, /fr/about, /fr/contact

Route Groups dengan Resource Controllers

Anda dapat menggabungkan route groups dengan resource controllers:

$router->group(['prefix' => 'admin', 'middleware' => 'admin'], function ($router) {
    $router->resource('users', 'UserController');
    $router->resource('posts', 'PostController');
    $router->resource('categories', 'CategoryController');
});

Ini akan menghasilkan route RESTful berikut:

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

Dan route serupa untuk posts dan categories.

Route Groups dengan Rate Limiting

Anda dapat menerapkan rate limiting ke grup route:

$router->group(['middleware' => 'throttle:60,1'], function ($router) {
    $router->get('api/users', 'ApiController@getUsers');
    $router->get('api/posts', 'ApiController@getPosts');
});

Dalam contoh di atas, route dalam grup dibatasi hingga 60 request per menit.

Praktik Terbaik

  • Organisasi Logis - Kelompokkan route berdasarkan fungsionalitas atau area aplikasi untuk meningkatkan keterbacaan dan pemeliharaan.
  • Hindari Terlalu Banyak Nesting - Terlalu banyak grup bersarang dapat membuat kode sulit dibaca. Batasi hingga 2-3 level.
  • Konsistensi Penamaan - Gunakan konvensi penamaan yang konsisten untuk prefix, namespace, dan nama route.
  • Middleware yang Tepat - Terapkan middleware hanya pada level yang diperlukan untuk menghindari overhead yang tidak perlu.
  • Dokumentasi - Tambahkan komentar untuk menjelaskan tujuan setiap grup route, terutama untuk grup yang kompleks.

Kesimpulan

Route Groups adalah fitur yang powerful di NexaUI yang membantu Anda mengorganisir dan mengelola route dengan lebih efisien. Dengan mengelompokkan route yang berbagi atribut yang sama, Anda dapat mengurangi duplikasi kode dan membuat aplikasi lebih mudah dipelihara.