Membangun Website Pet Online Shop Menggunakan Laravel 11

Hai Sobat BWA!🙌

Saat ini, penggunaan framework Laravel semakin banyak diminati karena kemudahan dan banyaknya fitur yang disediakan. Laravel juga menjadi salah satu framework PHP yang banyak digunakan oleh programmer di seluruh dunia. Maka dari itu, tidak ada salahnya jika kalian ingin terus mengembangkan skill pemrograman menggunakan framework ini. Salah satu cara yang dapat dilakukan adalah dengan banyak berlatih membuat project-project sederhana hingga kompleks agar kemampuan problem solving kalian juga terus meningkat.

Pada artikel kali ini, kita akan membuat project mengenai pet online shop, yang menyediakan fitur CRUD (Create, Read, Update, Delete) untuk tiap-tiap tabel. Untuk lebih jelasnya, simak artikel berikut sampai habis ya!

Persiapan

2(5).jpg

Berikut ini merupakan tools yang harus dipersiapkan:

  1. Visual Studio Code: Pastikan kalian sudah meng-install VS Code dan jika belum, kalian dapat meng-install nya di sini
  2. Xampp: Jika belum tersedia xampp pada komputer kalian, kalian dapat melakukan instalasi xampp terlebih dahulu. Kalian dapat meng-install nya di sini
  3. Postman: Aplikasi ini diperlukan untuk melakukan testing API yang telah kita buat. Install postman di sini
  4. PHP: PHP yang diperlukan untuk Laravel 11 adalah PHP dengan versi ≥ 7.3.
  5. Composer: Sebuah dependency manager untuk bahasa pemrograman PHP. Untuk mengecek apakah pada laptop kalian sudah ter-install composer, jalankan perintah composer -v . Dan jika belum ter-install, kalian dapat meng-installnya di sini

Struktur Database

Hal yang tidak kalah penting sebelum memulai membangun project adalah memperhatikan struktur database yang akan digunakan. Hal ini perlu diperhatikan agar struktur dan relasi antar tabel dalam database project kalian jelas. Pada project kali ini, struktur database yang digunakan adalah sebagai berikut:

tools (12).jpg

Pada project pet online shop ini kita menggunakan 5 tabel yaitu users, categories, customers, animals, dan transaction. Jangan lupa untuk selalu memperhatikan primary key dan foreign key dari masing-masing tabel.

Langkah-Langkah

Setelah semua persiapan selesai, sekarang saatnya kita mulai mengerjakan project!

1. Buka command prompt dan masuk pada direktori mana kalian akan menyimpan project ini. Lalu, create project menggunakan Laravel dengan menjalankan perintah berikut dan tunggu hingga proses instalasi selesai

composer create-project laravel/laravel pet_onlineshop

2. Buka phpmyadmin dan buatlah database baru dengan nama pet_onlineshop. Lalu, sesuaikan file .env dengan database yang telah kita buat

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=pet_onlineshop
DB_USERNAME=root
DB_PASSWORD=

3. Setelah database siap, selanjutnya kita akan membuat file migrasi, model, dan controller sekaligus. Jalankan perintah berikut satu-persatu ya!

php artisan make:model Categories -mcr
php artisan make:model Animals -mcr
php artisan make:model Customers -mcr
php artisan make:model Transactions -mcr
php artisan make:controller UserController

Karena secara default Laravel sudah menyediakan file migrasi dan model User, kita hanya perlu membuat controllernya dengan perintah php artisan make:controller UserController

4. Setelah itu buka file migration yang terletak pada direktori database/migration. Sesuaikan kodenya dengan kode berikut

-File Migrasi Users

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });
    }

-File Migrasi Categories

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('category_name');
            $table->timestamps();
        });
    }

-File Migrasi Animals

public function up(): void
    {
        Schema::create('animals', function (Blueprint $table) {
            $table->id();
            $table->foreignId('id_categories')->constrained('categories')->onDelete('cascade');
            $table->string('name');
            $table->text('description')->nullable();
            $table->decimal('price', 10, 2);
            $table->string('image')->nullable();
            $table->timestamps();
        });
    }

-File Migrasi Customers

public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('address')->nullable();
            $table->string('phone', 20)->nullable();
            $table->timestamps();
        });
    }

-File Migrasi Transactions

public function up()
    {
        Schema::create('transactions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('id_customers')->constrained('customers')->onDelete('cascade');
            $table->foreignId('id_animals')->constrained('animals')->onDelete('cascade');
            $table->date('transaction_date');
            $table->decimal('subtotal', 10, 2);
            $table->timestamps();
        });
    }

5. Setelah selesai, jalankan perintah php artisan migrate untuk melakukan migrasi database

6. Selanjutnya, buka file model yang berada pada direktori app/models. Buka file AnimalsModel.php dan sesuaikan dengan kode berikut:

class Animals extends Model
{
    protected $fillable = [
        'id_categories',
        'name',
        'description',
        'image',
        'price',
    ];
}

Lakukan hal yang sama untuk tabel Users, Categories, Customers, dan Transactions sesuai dengan struktur tabel yang telah ditentukan.

7. Langkah elanjutnya kita akan mengedit file controller dengan menambahkan function CRUD (Create, Read, Update, Delete) pada masing-masing tabel. Buka file controller yang terletak pada direktori app/http/controllers dan sesuaikan masing-masing file dengan kode berikut

-UserController

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the users.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $users = User::all();
        return response()->json($users);
    }

    /**
     * Store a newly created user in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8',
        ]);

        $user = User::create([
            'name' => $validatedData['name'],
            'email' => $validatedData['email'],
            'password' => bcrypt($validatedData['password']),
        ]);

        return response()->json($user, 201);
    }

    /**
     * Display the specified user.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $user = User::find($id);

        if (!$user) {
            return response()->json(['message' => 'User not found'], 404);
        }

        return response()->json($user);
    }

    /**
     * Update the specified user in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $user = User::find($id);

        if (!$user) {
            return response()->json(['message' => 'User not found'], 404);
        }

        $validatedData = $request->validate([
            'name' => 'sometimes|required|string|max:255',
            'email' => 'sometimes|required|string|email|max:255|unique:users,email,' . $id,
            'password' => 'sometimes|required|string|min:8',
        ]);

        if (isset($validatedData['password'])) {
            $validatedData['password'] = bcrypt($validatedData['password']);
        }

        $user->update($validatedData);

        return response()->json($user);
    }

    /**
     * Remove the specified user from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $user = User::find($id);

        if (!$user) {
            return response()->json(['message' => 'User not found'], 404);
        }

        $user->delete();

        return response()->json(['message' => 'User deleted successfully']);
    }
}

-CategoriesController

<?php

namespace App\Http\Controllers;

use App\Models\Categories;
use Illuminate\Http\Request;

class CategoriesController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $categories = Categories::all();
        return response()->json($categories);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'category_name' => 'required|string|max:255',
        ]);

        $categories = Categories::create($request->all());
        return response()->json($categories, 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Categories  $categories
     * @return \Illuminate\Http\Response
     */
    public function show(Categories $categories)
    {
        return response()->json($categories);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Categories  $category
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Categories $categories)
    {
        $request->validate([
            'category_name' => 'required|string|max:255',
        ]);

        $categories->update($request->all());
        return response()->json($categories);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function destroy(Categories $categories)
    {
        $category->delete();
        return response()->json(null, 204);
    }
}

-AnimalsController

<?php

namespace App\Http\Controllers;

use App\Models\Animals;
use Illuminate\Http\Request;

class AnimalsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $animals = Animals::all();
        return response()->json($animals);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'id_categories' => 'required|exists:categories,id',
            'description' => 'required',
            'price' => 'required|numeric',
            'image' => 'nullable',
        ]);

        $animals = Animals::create($request->all());
        return response()->json($animals, 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Animals  $animals
     * @return \Illuminate\Http\Response
     */
    public function show(Animals $animals)
    {
        return response()->json($animals);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Animals  $animals
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Animals $animals)
    {
        $request->validate([
            'name' => 'required',
            'id_categories' => 'required|exists:categories,id',
            'description' => 'required',
            'price' => 'required|numeric',
            'image' => 'nullable|url',
        ]);

        $animals->update($request->all());
        return response()->json($animals);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function destroy(Animals $animals)
    {
        $animals->delete();
        return response()->json(null, 204);
    }
}

-CustomersController

<?php

namespace App\Http\Controllers;

use App\Models\Customers;
use Illuminate\Http\Request;

class CustomersController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $customers = Customers::all();
        return response()->json($customers);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'address' => 'required',
            'phone' => 'required',
        ]);

        $customers = Customers::create($request->all());
        return response()->json($customers, 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Customers  $customers
     * @return \Illuminate\Http\Response
     */
    public function show(Customers $customers)
    {
        return response()->json($customers);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Customers  $customers
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Customers $customers)
    {
        $request->validate([
            'name' => 'required',
            'address' => 'required',
            'phone' => 'required',
        ]);

        $customers->update($request->all());
        return response()->json($customers);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function destroy(Customers $customers)
    {
        $customers->delete();
        return response()->json(null, 204);
    }
}

-TransactionsController

<?php

namespace App\Http\Controllers;

use App\Models\Transactions;
use Illuminate\Http\Request;

class TransactionsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $transactions = Transactions::all();
        return response()->json($transactions);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
            'id_customers' => 'required|exists:customers,id',
            'id_animals' => 'required|exists:animals,id',
            'transaction_date' => 'required|date',
            'subtotal' => 'required|numeric',
        ]);

        $transactions = Transactions::create($request->all());
        return response()->json($transactions, 201);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Transactions  $transactions
     * @return \Illuminate\Http\Response
     */
    public function show(Transactions $transactions)
    {
        return response()->json($transactions);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Transactions  $transactions
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Transactions $transactions)
    {
        $request->validate([
            'id_customers' => 'required|exists:customers,id',
            'id_animals' => 'required|exists:animals,id',
            'transaction_date' => 'required|date',
            'subtotal' => 'required|numeric',a
        ]);

        $transactions->update($request->all());
        return response()->json($transactions);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Category  $category
     * @return \Illuminate\Http\Response
     */
    public function destroy(Transactions $transactions)
    {
        $transactions->delete();
        return response()->json(null, 204);
    }
}

8. Buat file routing. Karena pada Laravel 11 tidak menyediakan route api secara langsung, kita harus membuatnya secara manual. Jalankan perintah php artisan install:api untuk membuat file route api.

Jangan lupa untuk import controller pada file api terlebih dahulu ya! Contohnya seperti berikut:

use App\Http\Controllers\UserController;
use App\Http\Controllers\CategoriesController;
use App\Http\Controllers\AnimalsController;
use App\Http\Controllers\CustomersController;
use App\Http\Controllers\TransactionsController;

Lalu, tambahkan kode berikut

Route::apiResource('/user', UserController::class);
Route::apiResource('/category', CategoriesController::class);
Route::apiResource('/animal', AnimalsController::class);
Route::apiResource('/customer', CustomersController::class);
Route::apiResource('/transaction', TransactionsController::class);

Testing API

Langkah selanjutnya adalah melakukan testing API untuk menguji apakah function yang telah kita buat dapat berjalan dengan lancar atau terdapat kesalahan. Buka postman dan jalankan php artisan serve untuk memulai.

Untuk menambahkan transaksi, kita memerlukan id_animals dan id_customers. Maka dari itu, kita perlu menambahkan data categories, animals, dan customers terlebih dahulu.

1. Add Category

2. Add Animal

3. Add Customer

4. Add Transaction

Kesimpulan

Artikel di atas merupakan penjelasan dari langkah-langkah untuk membangun website pet online shop menggunakan Laravel 11. Dimulai dengan membuat migrasi database untuk tabel animals, categories, customers, dan transactions, dilanjutkan dengan mengedit model dan controller untuk mendukung operasi CRUD dari tabel-tabel yang digunakan. Setelah itu, membuat file routing API yang dibuat secara manual dan diimpor ke dalam Laravel. Lalu sudah dijelaskan juga mengenai bagaimana melakukan testing API yang telah dibuat menggunakan Postman, termasuk menambahkan data categories, animals, customers, dan transactions.

Semoga artikel ini dapat bermanfaat ya! Dan bagi kalian yang tertarik untuk mempelajari lebih lanjut tentang Laravel, kalian bisa mempelajarinya secara gratis melalui BuildWithAngga loh! Selain itu, terdapat banyak kelas lain seperti membangun website rental mobil, booking travel, dan lain-lain yang nantinya dapat kalian jadikan sebagai portofolio. Jangan lupa kepoin kelas-kelasnya ya! Sampai jumpa di artikel selanjutnya🙌