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.
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
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 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 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 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
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
.
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;
});
});
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
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 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 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
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
.
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.
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.