Setelah sebelumnya belajar membuat RESTful API yang bersifat private (perlu otentikasi), maka sekarang kita akan lanjutkan belajar membuat RESTful API yang bersifat public, yang artinya API tersebut bisa diakses oleh siapa saja. Karena kita akan gunakan API tersebut untuk menampilkan data di halaman web.
Dan karena sebelumnya kita sudah pernah membuat CategoryResource, maka pada tahap ini kita
tidak perlu membuatnya lagi, karena kita akan menggunakan Resource yang sudah ada.
Langkah 1 - Membuat Controller Category Web
Sekarang kita akan membuat controller baru untuk category web. Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.
php artisan make:controller Api/Web/CategoryController
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 1 file controller
baru dengan nama CategoryController.php yang berada di dalam folder
app/Http/Controllers/Api/Web. Silahkan buka file tersebut, kemudian ubah semua
kode-nya menjadi seperti berikut ini :
<?php
namespace App\Http\Controllers\Api\Web;
use App\Models\Category;
use App\Http\Controllers\Controller;
use App\Http\Resources\CategoryResource;
class CategoryController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//get categories
$categories = Category::latest()->get();
//return with Api Resource
return new CategoryResource(true, 'List Data Categories', $categories);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($slug)
{
$category = Category::with('places.category', 'places.images')->where('slug', $slug)->first();
if($category) {
//return success with Api Resource
return new CategoryResource(true, 'List Data Places By : '.$category->name, $category);
}
//return failed with Api Resource
return new CategoryResource(false, 'Data Category Tidak Ditemukan!', null);
}
}
Dari perubahan kode di atas, pertama kita melakukan import Model Category terlebih
dahulu. Karena kita akan gunakan untuk mendapatkan data dari database.
use App\Models\Category;
Dan karena akan melakukan transformasi data ke dalam format JSON, maka kita juga akan
import CategoryResource yang sudah pernah kita buat sebelumnya.
use App\Http\Resources\CategoryResource;
Dan jika kita perhatikan, di dalam class CategoryController kita menambahkan 2
method baru, yaitu :
function index- untuk menampilkan list data categories dari database.function show- untuk menampilkan detail data category berdasarkan slug.
function index
Method ini akan kita gunakan untuk menampilkan data categories dari database.
Disini kita menggunakan Eloquent untuk mendapatkan data-nya. Dan akan kita urutkan data yang
ditampilkan berdasarkan yang paling terbaru menggunakan method latest.
//get categories
$categories = Category::latest()->get();
Setelah data berhasil di dapatkan, maka selanjutnya kita akan ubah menjadi format JSON
menggunakan CategoryResource.
//return with Api Resource
return new CategoryResource(true, 'List Data Categories', $categories);
function show
Method ini akan kita gunakan untuk menampilkan detail data category
berdasarkan slug. Dimana kita juga akan memanggil relasi places menggunakan
method with atau biasa disebut dengan Eager
Loading.
$category = Category::with('places.category', 'places.images')->where('slug', $slug)->first();
Di atas, dari Model Category memanggil relasi yang bernama places dan dari
relasi place memanggil 2 relasi lagi yaitu category dan images.
Jadi kalau di urutin kurang lebih seperti berikut ini :
Category
-> places
-> category
-> images
Jika detail category ditemukan, maka kita akan ubah data-nya menjadi format
JSON menggunakan CategoryResource.
//return success with Api Resource
return new CategoryResource(true, 'List Data Places By : '.$category->name, $category);
Tapi, jika data category tidak ditemukan, maka kita juga akan melakukan return
menggunakan CategoryResource dengan status success false.
//return failed with Api Resource
return new CategoryResource(false, 'Data Category Tidak Ditemukan!', null);
Langkah 2 - Menambahkan Route API Categories Web
Setelah berhasil membuat controller, maka sekarang kita lanjutkan untuk membuat route
untuk categories. Silahkan buka file routes/api.php kemudian tambahkan
route di bawah ini di luar prefix admin.
//group route with prefix "web"
Route::prefix('web')->group(function () {
//route categories index
Route::get('/categories', [App\Http\Controllers\Api\Web\CategoryController::class, 'index', ['as' => 'web']]);
//route categories show
Route::get('/categories/{slug?}', [App\Http\Controllers\Api\Web\CategoryController::class, 'show', ['as' => 'web']]);
});
Di atas kita membuat prefix baru untuk route yang kita gunakan, yaitu bernama
web. Dan di dalamnya kita menambahkan 2 route, yaitu /categories dan
/categories/{slug}. Jika file routes/api.php di tulis secara lengkap,
maka kurang lebih seperti berikut ini :
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
//group route with prefix "admin"
Route::prefix('admin')->group(function () {
//route login
Route::post('/login', App\Http\Controllers\Api\Admin\LoginController::class, ['as' => 'admin']);
//group route with middleware "auth:api"
Route::group(['middleware' => 'auth:api'], function() {
//route user logged in
Route::get('/user', function (Request $request) {
return $request->user();
})->name('user');
//route logout
Route::post('/logout', App\Http\Controllers\Api\Admin\LogoutController::class, ['as' => 'admin']);
//dashboard
Route::get('/dashboard', App\Http\Controllers\Api\Admin\DashboardController::class, ['as' => 'admin']);
//categories resource
Route::apiResource('/categories', App\Http\Controllers\Api\Admin\CategoryController::class, ['except' => ['create', 'edit'], 'as' => 'admin']);
//places resource
Route::apiResource('/places', App\Http\Controllers\Api\Admin\PlaceController::class, ['except' => ['create', 'edit'], 'as' => 'admin']);
//sliders resource
Route::apiResource('/sliders', App\Http\Controllers\Api\Admin\SliderController::class, ['except' => ['create', 'show', 'edit', 'update'], 'as' => 'admin']);
//users resource
Route::apiResource('/users', App\Http\Controllers\Api\Admin\UserController::class, ['except' => ['create', 'edit'], 'as' => 'admin']);
});
});
//group route with prefix "web"
Route::prefix('web')->group(function () {
//route categories index
Route::get('/categories', [App\Http\Controllers\Api\Web\CategoryController::class, 'index', ['as' => 'web']]);
//route categories show
Route::get('/categories/{slug?}', [App\Http\Controllers\Api\Web\CategoryController::class, 'show', ['as' => 'web']]);
});
Setelah itu, untuk memastikan apakah route yang sudah kita buat di atas berhasil, maka kita bisa menjalankan perintah berikut ini di dalam terminal/CMD :
php artisan route:list
Langkah 3 - Uji Coba API Categories Web
Sekarang kita lanjutkan untuk melakukan uji coba dari setiap method yang sudah kita buat di
atas. Disini kita akan melakukan uji coba di 2 method yang ada di dalam controller
CategoryController.
Uji Coba Method Index
Sekarang kita akan melakukan uji coba menampilkan list data categories. Silahkan buka
aplikasi Postman dan masukkan URL berikut ini http://localhost:8000/api/web/categories dan untuk method-nya silahkan
pilih GET.
Jika sudah sekarang silahkan klik Send. Jika berhasil, maka kita akan mendapatkan sebuah
response dalam format JSON yang berisi informasi list data
categories.
Uji Coba Show
Sekarang kita lanjutkan untuk melakukan uji coba proses show, disini untuk parameternya akan
diambil menggunakan data slug. Silahkan buka aplikasi Postman kemudian
masukkan URL berikut ini http://localhost:8000/api/web/categories/pelabuhan dan untuk method-nya
silahkan pilih GET.
CATATAN ! :
pelabuhanmerupakan salah satu slug yang saya miliki di dalam tablepelabuhan, jadi silahkan disesuaikan dengan slug yang teman-teman punya.
Jika sudah, silahkan klik Send dan jika berhasil maka kita akan mendapatkan sebuah
response dalam format JSON yang berisi informasi list data places
berdasarkan data category.
INFORMASI : di atas, untuk key
placesmasih bernilai array kosong[], karena kita belum memiliki data places yang sesuai dengan category tersebut.






