flash sale
hamburger-menu

Tips Back-End

Meningkatkan skills menjadi 1% lebih baik

Kelas Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website E-learning Online di BuildWithAngga

Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website E-learning Online

Dalam dunia web development, membuat fitur seperti CRUD, login, atau registrasi sudah menjadi hal yang umum. Namun, ada satu langkah penting yang sering diabaikan oleh banyak programmer, yaitu unit testing. Bayangkan kita sedang membangun sebuah website e-learning, misalnya, yang memiliki banyak fitur seperti pengelolaan kursus, sistem registrasi, dan pengelolaan konten pembelajaran. Setiap fitur tersebut membutuhkan unit testing untuk memastikan bahwa semua berjalan dengan baik dan mempermudah tim dalam melakukan uji coba serta mengurangi risiko terjadinya bug di kemudian hari. Mengapa Unit Testing Penting? Analoginya seperti ini: bayangkan Anda sedang membangun sebuah rumah. Setiap kali Anda selesai membangun satu bagian, Anda akan memeriksa apakah bagian tersebut kokoh dan sesuai dengan rencana. Jika ada kesalahan, Anda bisa langsung memperbaikinya sebelum melanjutkan ke bagian lain. Unit testing berfungsi seperti pemeriksaan ini dalam pembangunan website. Setiap kali kita membuat fungsi atau fitur, kita bisa langsung menguji apakah fitur tersebut bekerja sesuai dengan yang diharapkan sebelum melanjutkan ke fitur berikutnya. Dengan begitu, ketika seluruh website selesai dibuat, kita tidak perlu khawatir lagi akan adanya error di setiap bagian. 5 Fitur Utama pada Website E-learning Online Website e-learning yang efektif harus memiliki beberapa fitur utama untuk memberikan pengalaman belajar yang optimal. Berikut lima fitur penting yang biasanya ada: 1) Daftar Kursus Fitur ini memungkinkan pengguna untuk melihat dan mencari kursus berdasarkan kategori, tingkat kesulitan, atau topik tertentu. Pengguna bisa mendapatkan informasi lengkap seperti deskripsi, durasi, dan profil instruktur untuk memilih kursus yang tepat. 2) Sistem Registrasi Fitur ini memudahkan pengguna untuk membuat akun dan mendaftar kursus. Selain itu, sistem registrasi membantu melacak progres belajar pengguna, mengelola akses ke konten premium, dan memberikan notifikasi terkait aktivitas kursus. 3) Fitur Ujian dan Kuis Ujian dan kuis membantu pengguna menguji pemahaman mereka terhadap materi. Fitur ini biasanya mencakup soal pilihan ganda, isian singkat, atau essay dengan penilaian otomatis dan umpan balik langsung. 4) Manajemen Konten Pembelajaran Instruktur dapat mengelola materi pembelajaran seperti video, dokumen, dan presentasi. Materi dapat disusun dalam modul atau bab untuk memberikan pembelajaran yang terstruktur dan mudah diakses. 5) Sistem Penilaian Peserta Fitur ini memungkinkan instruktur memberikan penilaian berdasarkan hasil ujian, tugas, dan partisipasi. Peserta dapat melihat progres mereka dan mendapatkan umpan balik yang membantu memperbaiki hasil belajar. Cara Membuat Proyek Laravel 11 Baru dengan Composer dan Mengatur .env untuk Unit Testing Untuk memulai proyek Laravel 11, buka terminal dan jalankan perintah berikut untuk mengunduh dan membuat proyek baru: composer create-project --prefer-dist laravel/laravel elearning-platform Setelah proyek berhasil dibuat, masuk ke direktori proyek: cd elearning-platform Selanjutnya, lakukan konfigurasi pada file .env yang ada di root proyek. Sesuaikan pengaturan database agar dapat digunakan untuk unit testing. Misalnya, gunakan database sqlite yang biasanya digunakan untuk keperluan testing: DB_CONNECTION=sqlite DB_DATABASE=/path/to/database/testing.sqlite Jangan lupa untuk membuat file testing.sqlite di direktori yang sudah ditentukan. Anda bisa menggunakan perintah berikut di terminal: touch /path/to/database/testing.sqlite Untuk mempermudah unit testing, pastikan Anda sudah menjalankan perintah berikut untuk membuat database testing: php artisan migrate Contoh Koding Pengujian untuk Fitur Registrasi Kursus Buat file test baru untuk pengujian registrasi kursus dengan menggunakan perintah: php artisan make:test CourseRegistrationTest Kemudian, tambahkan pengujian berikut di file tests/Feature/CourseRegistrationTest.php: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CourseRegistrationTest extends TestCase { use RefreshDatabase; public function test_user_can_register_for_a_course() { $user = User::factory()->create(); $this->actingAs($user); $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => $user->id, ]); $response->assertStatus(200); $response->assertSee('Kursus berhasil didaftarkan'); } } Contoh Koding Pengujian untuk Fitur Manajemen Konten Pembelajaran Buat file test baru untuk menguji manajemen konten pembelajaran: php artisan make:test ContentManagementTest Tambahkan kode berikut di file tests/Feature/ContentManagementTest.php: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Content; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ContentManagementTest extends TestCase { use RefreshDatabase; public function test_instructor_can_add_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $response = $this->post('/contents', [ 'title' => 'Laravel Basics', 'description' => 'Introduction to Laravel framework.', 'content' => 'This is the content for the Laravel Basics module.', ]); $response->assertStatus(201); $this->assertDatabaseHas('contents', [ 'title' => 'Laravel Basics' ]); } public function test_instructor_can_update_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $content = Content::factory()->create(); $response = $this->put("/contents/{$content->id}", [ 'title' => 'Updated Laravel Basics', 'description' => 'Updated introduction to Laravel framework.', 'content' => 'This is the updated content for the Laravel Basics module.', ]); $response->assertStatus(200); $this->assertDatabaseHas('contents', [ 'title' => 'Updated Laravel Basics' ]); } } Tata Cara Membuat dan Mengatur File Unit Testing untuk 5 Fitur E-learning Untuk membuat dan mengatur file unit testing bagi kelima fitur, Anda bisa menggunakan php artisan make:test untuk membuat file test secara terpisah. Misalnya, Anda ingin membuat file test untuk sistem registrasi, manajemen konten, dan sistem penilaian peserta. Buat file test untuk masing-masing fitur: php artisan make:test CourseRegistrationTest php artisan make:test ContentManagementTest php artisan make:test AssessmentSystemTest Pada file CourseRegistrationTest.php, tambahkan pengujian untuk registrasi kursus: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Course; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CourseRegistrationTest extends TestCase { use RefreshDatabase; public function test_user_can_register_for_course() { $user = User::factory()->create(); $course = Course::factory()->create(); $this->actingAs($user); $response = $this->post('/courses/register', [ 'course_id' => $course->id, 'user_id' => $user->id, ]); $response->assertStatus(200); $response->assertJson([ 'message' => 'Kursus berhasil didaftarkan' ]); } } Pada file ContentManagementTest.php, tambahkan pengujian untuk manajemen konten: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Content; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ContentManagementTest extends TestCase { use RefreshDatabase; public function test_instructor_can_create_content() { $instructor = User::factory()->create(['role' => 'instructor']); $this->actingAs($instructor); $response = $this->post('/contents', [ 'title' => 'Laravel Basics', 'description' => 'Introduction to Laravel', 'content' => 'This is the content of Laravel Basics.', ]); $response->assertStatus(201); $this->assertDatabaseHas('contents', [ 'title' => 'Laravel Basics' ]); } } Pada file AssessmentSystemTest.php, tambahkan pengujian untuk sistem penilaian peserta: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\User; use App\\\\Models\\\\Course; use App\\\\Models\\\\Assessment; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class AssessmentSystemTest extends TestCase { use RefreshDatabase; public function test_instructor_can_give_assessment() { $instructor = User::factory()->create(['role' => 'instructor']); $course = Course::factory()->create(['instructor_id' => $instructor->id]); $student = User::factory()->create(); $this->actingAs($instructor); $response = $this->post("/courses/{$course->id}/assessments", [ 'student_id' => $student->id, 'score' => 85, 'feedback' => 'Good job!' ]); $response->assertStatus(201); $this->assertDatabaseHas('assessments', [ 'student_id' => $student->id, 'score' => 85, 'feedback' => 'Good job!' ]); } } Dengan cara ini, Anda dapat membuat dan mengatur file unit testing untuk masing-masing fitur e-learning secara terpisah, sehingga setiap fitur dapat diuji secara mendetail dan terstruktur. Menggunakan RefreshDatabase di Laravel tidak akan menghapus data asli pada server production karena RefreshDatabase secara otomatis bekerja hanya di environment testing. Laravel memisahkan pengaturan environment untuk pengujian, development, dan production. Saat melakukan pengujian, Laravel akan menggunakan file .env.testing atau konfigurasi testing yang berbeda dari environment production. Jadi, secara default, RefreshDatabase akan mereset database hanya untuk pengujian, bukan untuk environment production. Namun, untuk memastikan keamanan lebih lanjut, penting bagi developer untuk mengikuti beberapa langkah preventif agar data production tetap aman: Periksa Environment: Pastikan aplikasi menggunakan environment testing saat menjalankan unit test. Ini bisa diatur di file phpunit.xml atau file .env.testing. Dengan cara ini, database yang digunakan untuk pengujian tidak akan sama dengan database production.Gunakan SQLite atau Database Terpisah untuk Testing: Anda bisa menggunakan SQLite (in-memory database) atau database terpisah hanya untuk keperluan pengujian. Dengan demikian, tidak ada risiko database production terkena dampak pengujian.Hindari Menjalankan Pengujian di Production: Jangan pernah menjalankan perintah testing di environment production. Anda bisa menambahkan pengecekan di kode untuk memastikan pengujian tidak dijalankan di production. Berikut adalah contoh koding sederhana untuk memastikan RefreshDatabase hanya digunakan di environment testing: <?php namespace Tests\\\\Feature; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ExampleTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); // Pastikan unit test hanya berjalan di environment testing if (app()->environment() !== 'testing') { $this->markTestSkipped('Testing hanya boleh dijalankan di environment testing.'); } } public function test_example() { // Contoh pengujian sederhana $this->assertTrue(true); } } Kode di atas memastikan bahwa pengujian akan dilewati jika environment yang digunakan bukan testing. Dengan melakukan langkah-langkah ini, Anda bisa menghindari potensi risiko menghapus data asli pada server production saat melakukan unit testing. Kesalahan Umum Ketika Melakukan Unit Testing pada Projek E-learning Online Dalam melakukan unit testing pada proyek e-learning online, ada beberapa kesalahan yang sering terjadi dan dapat menyebabkan pengujian menjadi tidak efektif atau bahkan berdampak negatif pada lingkungan pengembangan. Berikut adalah tiga kesalahan umum yang perlu dihindari: 1) Tidak Menggunakan Database Testing Salah satu kesalahan yang sering dilakukan adalah menggunakan database asli atau production untuk pengujian. Ini sangat berisiko karena dapat mengubah atau merusak data penting yang ada di database asli. Sebagai gantinya, sebaiknya gunakan database testing seperti SQLite atau database sementara yang terpisah dari database utama. Contoh kesalahan: // Menggunakan database MySQL production secara langsung config(['database.connections.mysql.database' => 'production_db']); public function test_course_registration() { $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 1, ]); $response->assertStatus(200); } Perbaikan: Gunakan database testing yang aman dan terisolasi: // Menggunakan SQLite untuk pengujian config(['database.connections.sqlite.database' => ':memory:']); public function test_course_registration() { $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 1, ]); $response->assertStatus(200); } 2) Menghubungkan ke Layanan Video Hosting Langsung Pada aplikasi e-learning, terkadang diperlukan integrasi dengan layanan video hosting seperti YouTube atau Vimeo untuk menampilkan konten pembelajaran. Menghubungkan langsung ke layanan ini dalam pengujian dapat menyebabkan pengujian menjadi lambat dan tidak stabil, terutama jika layanan tersebut mengalami downtime atau masalah koneksi. Contoh kesalahan: public function test_video_content_is_accessible() { // Menghubungkan ke API YouTube langsung $response = Http::get('<https://www.googleapis.com/youtube/v3/videos>', [ 'id' => 'video_id', 'key' => 'API_KEY' ]); $response->assertStatus(200); } Perbaikan: Gunakan mock atau simulasi untuk meniru respons dari layanan eksternal: use Illuminate\\\\Support\\\\Facades\\\\Http; public function test_video_content_is_accessible() { // Simulasi respons dari API YouTube Http::fake([ '<https://www.googleapis.com/youtube/v3/videos>' => Http::response([ 'items' => [ ['id' => 'video_id', 'status' => 'public'] ] ], 200) ]); $response = Http::get('<https://www.googleapis.com/youtube/v3/videos>', [ 'id' => 'video_id', 'key' => 'API_KEY' ]); $response->assertStatus(200); } 3) Membuat Pengujian yang Terlalu Kompleks Kesalahan lain adalah membuat pengujian yang terlalu kompleks dan sulit dipelihara. Pengujian yang mencakup terlalu banyak skenario dalam satu test case akan sulit dipahami dan di-debug. Pengujian sebaiknya fokus pada satu skenario spesifik dan menggunakan metode yang mudah diikuti. Contoh kesalahan: public function test_course_creation_and_registration_with_invalid_data() { // Pengujian terlalu kompleks, mencakup banyak skenario $response = $this->post('/courses', [ 'title' => '', 'description' => '', ]); $response->assertStatus(422); $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 'invalid', ]); $response->assertStatus(422); $response = $this->get('/courses/1'); $response->assertStatus(404); } Perbaikan: Pisahkan pengujian ke dalam beberapa test case yang lebih spesifik: public function test_course_creation_with_invalid_data() { // Hanya menguji pembuatan kursus dengan data yang tidak valid $response = $this->post('/courses', [ 'title' => '', 'description' => '', ]); $response->assertStatus(422); } public function test_registration_with_invalid_user() { // Menguji registrasi kursus dengan user yang tidak valid $response = $this->post('/courses/register', [ 'course_id' => 1, 'user_id' => 'invalid', ]); $response->assertStatus(422); } Dengan menghindari kesalahan-kesalahan ini, pengujian akan menjadi lebih efektif, aman, dan mudah dikelola. Pastikan setiap unit test dijalankan pada environment yang tepat dan hanya menguji satu skenario sederhana per test case. Penutup Laravel terus menjadi pilihan utama bagi para developer karena pembaruan fitur yang rutin dan memudahkan proses pengembangan aplikasi. Dengan banyaknya peningkatan dan komunitas yang aktif, framework ini akan tetap relevan dan populer di kalangan programmer. Untuk belajar lebih dalam tentang Laravel dan topik web development lainnya, pastikan untuk terus memantau website BuildWithAngga. Mereka sering menyediakan kelas gratis dengan studi kasus menarik yang dibawakan oleh mentor berpengalaman, serta memberikan akses kelas seumur hidup yang sangat bermanfaat bagi pengembangan skill Anda. Jangan lewatkan kesempatan untuk belajar dan berkembang bersama komunitas yang solid!

Kelas Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website Toko Buah Online di BuildWithAngga

Cara Bikin dan Melakukan Unit Testing dengan Laravel 11 Pada Projek Website Toko Buah Online

Dalam pengembangan perangkat lunak, selain membuat fitur CRUD atau sistem login, programmer juga wajib menyediakan dan melakukan unit testing. Bayangkan jika kita membuat sebuah resep masakan; kita perlu mencicipi setiap bahan untuk memastikan rasa yang pas. Begitu pula dengan unit testing, yang membantu tim untuk menguji coba fitur sebelum dirilis, memastikan semuanya berfungsi dengan baik dan mengurangi kemungkinan kesalahan di masa depan. Di Laravel 11, melakukan unit testing menjadi sangat mudah. Laravel menyediakan berbagai alat dan fungsionalitas yang memungkinkan programmer untuk menulis dan menjalankan pengujian dengan cepat. Dengan bantuan framework ini, pengujian bisa dilakukan secara otomatis, sehingga pengembang dapat lebih fokus pada pengembangan fitur baru tanpa khawatir akan kesalahan yang mungkin ada. Ketika membuat website jual buah online, ada beberapa fitur unggulan yang biasanya tersedia. Pertama, halaman produk yang menampilkan berbagai jenis buah dengan deskripsi dan harga. Kedua, keranjang belanja yang memungkinkan pengguna untuk menambahkan barang sebelum melakukan checkout. Ketiga, sistem pembayaran yang aman untuk memudahkan transaksi. Keempat, pelacakan pesanan untuk memberi tahu pengguna tentang status pengiriman. Terakhir, fitur ulasan pengguna, yang memungkinkan pembeli memberikan feedback tentang produk yang mereka beli, meningkatkan kepercayaan pengguna lain. Cara Membuat Proyek Laravel 11 Baru dengan Composer dan Mengatur .env untuk Unit Testing Untuk memulai proyek Laravel 11 baru, pertama-tama pastikan Anda telah menginstal Composer di sistem Anda. Berikut adalah langkah-langkahnya: Buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek baru: composer create-project laravel/laravel nama-proyek Gantilah nama-proyek dengan nama yang Anda inginkan. Setelah proses selesai, masuk ke direktori proyek: cd nama-proyek Selanjutnya, Anda perlu mengatur file .env untuk konfigurasi database yang digunakan dalam unit testing. Buka file .env di editor teks Anda dan sesuaikan pengaturan database, misalnya: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD=password Gantilah nilai-nilai di atas sesuai dengan konfigurasi database Anda. Untuk menjalankan unit testing, pastikan Anda sudah membuat beberapa fitur atau model yang ingin diuji. Misalnya, jika Anda memiliki model Product, buatlah pengujian untuk memastikan model tersebut berfungsi dengan baik. Jalankan perintah berikut untuk membuat pengujian: php artisan make:test ProductTest Kemudian, buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_product_creation() { $response = $this->post('/api/products', [ 'name' => 'Apple', 'price' => 2000, ]); $response->assertStatus(201); $this->assertDatabaseHas('products', [ 'name' => 'Apple', 'price' => 2000, ]); } } Terakhir, jalankan pengujian dengan perintah berikut: php artisan test Dengan langkah-langkah di atas, Anda sudah berhasil membuat proyek Laravel 11 baru, mengatur file .env, dan melakukan unit testing pada fitur yang telah Anda buat. Cara Membuat dan Mengatur File Unit Testing untuk Fitur-Fitur di Laravel 11 Untuk melakukan unit testing pada lima fitur utama website jual buah online, pertama-tama pastikan Anda sudah memiliki struktur database dan API endpoint yang sesuai. Berikut adalah cara membuat dan mengatur file unit testing untuk masing-masing fitur dengan contoh kode lengkap. 1. Pengujian Fitur Produk Buat file test baru untuk menguji fitur produk: php artisan make:test ProductTest Buka file tests/Feature/ProductTest.php dan tambahkan kode berikut untuk menguji fitur produk, termasuk membuat dan memastikan produk tersimpan di database: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_create_product() { $response = $this->postJson('/api/products', [ 'name' => 'Apple', 'price' => 10000, 'stock' => 50, ]); $response->assertStatus(201); $this->assertDatabaseHas('products', [ 'name' => 'Apple', 'price' => 10000, ]); } } 2. Pengujian Fitur Keranjang Belanja Buat file test baru untuk menguji fitur keranjang belanja: php artisan make:test CartTest Buka file tests/Feature/CartTest.php dan tambahkan kode berikut untuk menguji fitur menambah produk ke keranjang: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class CartTest extends TestCase { use RefreshDatabase; public function test_add_to_cart() { $product = Product::create([ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response = $this->postJson('/api/cart', [ 'product_id' => $product->id, 'quantity' => 2, ]); $response->assertStatus(200) ->assertJson([ 'added' => true, 'product_id' => $product->id, 'quantity' => 2, ]); } } 3. Pengujian Fitur Pembayaran Buat file test baru untuk menguji fitur pembayaran: php artisan make:test PaymentTest Buka file tests/Feature/PaymentTest.php dan tambahkan kode berikut untuk menguji fitur pembayaran: <?php namespace Tests\\\\Feature; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class PaymentTest extends TestCase { use RefreshDatabase; public function test_secure_payment() { $response = $this->postJson('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200) ->assertJson([ 'payment_status' => 'success', ]); } } 4. Pengujian Fitur Pelacakan Pesanan Buat file test baru untuk menguji fitur pelacakan pesanan: php artisan make:test OrderTrackingTest Buka file tests/Feature/OrderTrackingTest.php dan tambahkan kode berikut untuk menguji fitur pelacakan pesanan: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Order; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class OrderTrackingTest extends TestCase { use RefreshDatabase; public function test_order_tracking() { $order = Order::create([ 'user_id' => 1, 'status' => 'shipped', 'total' => 25000, ]); $response = $this->getJson('/api/orders/' . $order->id); $response->assertStatus(200) ->assertJson([ 'status' => 'shipped', ]); } } 5. Pengujian Fitur Ulasan Pengguna Buat file test baru untuk menguji fitur ulasan pengguna: php artisan make:test ReviewTest Buka file tests/Feature/ReviewTest.php dan tambahkan kode berikut untuk menguji fitur ulasan pengguna: <?php namespace Tests\\\\Feature; use App\\\\Models\\\\Product; use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ReviewTest extends TestCase { use RefreshDatabase; public function test_user_review() { $product = Product::create([ 'name' => 'Grapes', 'price' => 8000, 'stock' => 20, ]); $response = $this->postJson('/api/reviews', [ 'product_id' => $product->id, 'rating' => 5, 'comment' => 'Excellent quality!', ]); $response->assertStatus(201) ->assertJson([ 'reviewed' => true, 'product_id' => $product->id, ]); } } Setelah semua file pengujian selesai dibuat, jalankan perintah berikut untuk menjalankan semua pengujian: php artisan test Semua pengujian akan dijalankan, dan Anda akan melihat hasilnya di terminal. Dengan cara ini, Anda bisa memastikan bahwa setiap fitur di website toko buah online berfungsi sesuai dengan harapan. Pengertian tentang RefreshDatabase Menggunakan RefreshDatabase pada Laravel hanya akan memengaruhi database pengujian (testing) dan tidak akan menghapus atau memengaruhi data asli di server production Anda. Namun, penting untuk memahami bagaimana RefreshDatabase bekerja agar tidak terjadi kesalahpahaman. Bagaimana RefreshDatabase Bekerja? RefreshDatabase adalah trait yang digunakan pada pengujian Laravel untuk memastikan database dalam keadaan bersih setiap kali pengujian dijalankan. Trait ini akan menjalankan perintah migrate:fresh yang akan menghapus semua tabel di database dan kemudian membuat ulang tabel sesuai dengan migrasi yang ada. Penggunaan Lokal atau Pengembangan: Saat Anda menjalankan pengujian secara lokal atau di lingkungan pengembangan, RefreshDatabase akan bekerja pada database pengujian yang ditentukan di file .env.testing atau di .env jika tidak ada konfigurasi khusus untuk testing.Penggunaan di Production: Laravel tidak secara otomatis menggunakan database production untuk pengujian. Saat Anda menjalankan perintah php artisan test atau phpunit, Laravel akan menggunakan koneksi database yang ditentukan untuk lingkungan pengujian. Ini biasanya diatur di file .env.testing atau melalui konfigurasi di file phpunit.xml. Apakah Data di Production Akan Hilang? Tidak, data di server production Anda tidak akan terhapus jika: Anda tidak menjalankan perintah pengujian (php artisan test atau phpunit) di lingkungan production.Anda memastikan bahwa pengujian dilakukan dengan koneksi database yang terpisah dari database production, yang biasanya diatur dalam file .env.testing. Tips untuk Keamanan Pengujian Selalu Gunakan Koneksi Database Pengujian: Pastikan koneksi database untuk pengujian berbeda dengan koneksi database production. Anda bisa membuat database khusus untuk pengujian.Cek Konfigurasi env: Pastikan Anda menggunakan file .env.testing atau pengaturan khusus di file phpunit.xml untuk koneksi database pengujian.Jangan Jalankan php artisan test di Production: Hindari menjalankan pengujian di lingkungan production untuk menghindari risiko yang tidak perlu. Dengan mengikuti praktik-praktik di atas, Anda dapat menggunakan RefreshDatabase dengan aman tanpa khawatir data production akan terpengaruh. Kesalahan Umum dalam Melakukan Unit Testing di Laravel Unit testing adalah bagian penting dari pengembangan aplikasi, namun seringkali terdapat kesalahan yang dilakukan oleh programmer, terutama bagi yang baru memulai. Berikut adalah tiga kesalahan umum saat melakukan unit testing di Laravel beserta contoh kode yang relevan. Menggunakan Database Production untuk Pengujian Salah satu kesalahan terbesar adalah menggunakan database production untuk menjalankan pengujian. Ini sangat berbahaya karena dapat menghapus atau memodifikasi data yang sebenarnya digunakan dalam aplikasi. Misalnya, jika menggunakan RefreshDatabase tanpa memastikan bahwa koneksi database sudah diset untuk pengujian, semua data di database production bisa terhapus. Contoh kode yang salah: use Illuminate\\\\Foundation\\\\Testing\\\\RefreshDatabase; use Tests\\\\TestCase; class ProductTest extends TestCase { use RefreshDatabase; public function test_create_product() { // Jika koneksi menggunakan database production, ini akan menghapus semua data. $response = $this->post('/api/products', [ 'name' => 'Apple', 'price' => 10000, 'stock' => 50, ]); $response->assertStatus(201); } } Pastikan untuk menggunakan database khusus pengujian dengan menambahkan konfigurasi di file .env.testing seperti: DB_CONNECTION=mysql_testing DB_DATABASE=testing_database Tidak Menggunakan Mocking untuk Layanan Eksternal Ketika melakukan unit testing, penting untuk memisahkan pengujian dari dependensi luar, seperti API eksternal atau layanan pembayaran. Menghubungkan langsung ke layanan eksternal saat pengujian tidak hanya memperlambat proses, tetapi juga dapat menyebabkan hasil yang tidak konsisten. Contoh kode yang salah: class PaymentTest extends TestCase { public function test_payment_process() { // Memanggil layanan pembayaran eksternal secara langsung. $response = $this->post('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200); } } Untuk mengatasi ini, gunakan mocking atau fake service agar pengujian tetap cepat dan terisolasi: class PaymentTest extends TestCase { public function test_payment_process() { // Menggunakan mock untuk layanan pembayaran. $this->mock(PaymentService::class, function ($mock) { $mock->shouldReceive('process') ->andReturn(['status' => 'success']); }); $response = $this->post('/api/payment', [ 'amount' => 15000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200) ->assertJson(['status' => 'success']); } } Menulis Pengujian Terlalu Kompleks atau Tidak Fokus Pengujian unit seharusnya hanya menguji satu fungsi atau bagian kecil dari kode. Kesalahan yang umum adalah menulis pengujian yang terlalu kompleks, yang menguji beberapa fitur sekaligus, sehingga sulit menemukan penyebab kesalahan jika pengujian gagal. Contoh kode yang salah: class ComplexFeatureTest extends TestCase { public function test_complex_feature() { // Menguji terlalu banyak hal dalam satu pengujian. $response = $this->post('/api/products', [ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response->assertStatus(201); $response = $this->post('/api/cart', [ 'product_id' => 1, 'quantity' => 2, ]); $response->assertStatus(200); $response = $this->post('/api/payment', [ 'amount' => 10000, 'payment_method' => 'credit_card', ]); $response->assertStatus(200); } } Untuk pengujian yang lebih baik, pisahkan pengujian menjadi beberapa bagian yang lebih kecil dan terfokus: class ProductTest extends TestCase { public function test_create_product() { $response = $this->post('/api/products', [ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response->assertStatus(201); } } class CartTest extends TestCase { public function test_add_to_cart() { $product = Product::create([ 'name' => 'Banana', 'price' => 5000, 'stock' => 30, ]); $response = $this->post('/api/cart', [ 'product_id' => $product->id, 'quantity' => 2, ]); $response->assertStatus(200); } } Penutup dan saran mentor Laravel terus berkembang dan menjadi salah satu framework PHP yang paling populer berkat update fitur-fitur menarik yang memudahkan developer dalam mengembangkan aplikasi web dengan cepat dan efisien. Dengan komunitas yang besar dan dokumentasi yang lengkap, Laravel memberikan dukungan yang kuat bagi para programmer di seluruh dunia. Untuk terus mengasah kemampuan Anda dalam menggunakan Laravel, pastikan untuk selalu memantau BuildWithAngga. Mereka sering mengupdate kelas-kelas gratis dengan studi kasus yang menarik dan dipandu oleh mentor berpengalaman. Selain itu, Anda juga akan mendapatkan akses seumur hidup untuk setiap kelas yang diikuti, sehingga Anda bisa belajar kapan saja tanpa batasan waktu. Terus belajar dan kembangkan keterampilan Anda bersama BuildWithAngga!

Kelas Tutorial Task Schedule Laravel 11 Pada Projek Website Sewa Kantor di BuildWithAngga

Tutorial Task Schedule Laravel 11 Pada Projek Website Sewa Kantor

Dalam membangun sebuah website sewa kantor, tujuan utama kita adalah memberikan pengalaman terbaik bagi pengguna. Bayangkan, seorang pengunjung datang ke website kita untuk mencari kantor yang ideal. Jika informasi yang mereka butuhkan sulit diakses atau tampilan website kita tidak menarik, besar kemungkinan mereka akan meninggalkan website tanpa melakukan tindakan apa pun. Pengalaman pengguna yang baik bisa diibaratkan seperti pelayan ramah di sebuah restoran, yang tahu kapan harus memberikan menu, kapan mengisi ulang minuman, dan kapan menawarkan bantuan. Semuanya dilakukan dengan tepat waktu dan tanpa membuat pelanggan merasa terganggu. Untuk mencapai hal ini, kita perlu memastikan bahwa website berjalan dengan lancar, informasi selalu up-to-date, dan berbagai fitur otomatis bekerja sesuai jadwal. Di sinilah fitur task schedule pada Laravel 11 bisa sangat membantu. Fitur Task Schedule Laravel untuk Otomatisasi Website Laravel adalah framework PHP yang populer di kalangan developer karena banyaknya fitur canggih yang ditawarkan, salah satunya adalah task scheduling. Fitur ini memungkinkan kita untuk mengatur tugas-tugas tertentu agar berjalan secara otomatis pada waktu yang sudah ditentukan. Misalnya, mengirim email pengingat kepada calon penyewa yang belum menyelesaikan proses booking, membersihkan data lama dari database, atau melakukan backup data secara rutin. Analoginya, fitur task schedule ini seperti alarm pada smartphone kita. Bayangkan, kita punya alarm yang disetel untuk berbagai keperluan: bangun pagi, mengingatkan makan siang, dan meeting sore. Semua dilakukan secara otomatis sesuai waktu yang sudah ditentukan. Demikian juga, task schedule di Laravel bisa diatur untuk menjalankan tugas-tugas rutin tanpa kita harus melakukannya secara manual setiap saat. Fitur ini sangat berguna untuk website sewa kantor karena kita dapat: Mengirimkan notifikasi harian kepada penyewa mengenai tagihan yang akan jatuh tempo.Memperbarui status ketersediaan kantor secara otomatis setiap malam berdasarkan data terbaru.Mengirim laporan harian kepada admin mengenai jumlah penyewa baru, permintaan kunjungan, dan sebagainya. Dengan adanya task schedule, kita bisa fokus pada pengembangan fitur lain tanpa khawatir tentang tugas-tugas rutin yang harus dijalankan. Cara Menggunakan Task Schedule di Laravel Untuk menggunakan task scheduling di Laravel, pertama-tama kita harus mengkonfigurasi Laravel Cron Job di server. Setelah itu, kita bisa mendefinisikan tugas-tugas apa saja yang ingin dijalankan secara otomatis di file app/Console/Kernel.php. Berikut ini adalah contoh sederhana penggunaan task schedule: protected function schedule(Schedule $schedule) { // Mengirim email pengingat setiap hari pada pukul 08:00 pagi $schedule->call(function () { // Logika pengiriman email di sini })->dailyAt('08:00'); } Untuk lebih mendalami cara menggunakan fitur ini, kamu bisa membaca dokumentasi resmi Laravel tentang Task Scheduling. Dengan fitur ini, kita bisa memastikan bahwa tugas-tugas yang bersifat rutin dan berulang dapat dijalankan secara otomatis, sehingga pengguna mendapatkan pengalaman yang lebih baik dan pengelolaan website menjadi lebih efisien. Cara Membuat Projek Website Sewa Kantor dengan Laravel 11 Menggunakan Composer Untuk memulai proyek website sewa kantor dengan Laravel 11, langkah pertama yang perlu dilakukan adalah memastikan bahwa Composer sudah terinstall di sistem. Composer adalah alat yang digunakan untuk mengelola dependensi PHP dan merupakan cara termudah untuk menginstall Laravel. Langkah pertama, buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek Laravel baru: composer create-project --prefer-dist laravel/laravel sewa-kantor Perintah di atas akan mengunduh Laravel 11 beserta semua dependensi yang diperlukan ke dalam folder sewa-kantor. Setelah proses instalasi selesai, masuk ke direktori proyek dengan perintah berikut: cd sewa-kantor Selanjutnya, buat database baru di MySQL atau PostgreSQL dan sesuaikan pengaturan koneksi database di file .env yang ada di root proyek Laravel. Misalnya, sesuaikan bagian ini: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=sewa_kantor_db DB_USERNAME=root DB_PASSWORD=your_password Setelah itu, jalankan perintah migrasi untuk membuat tabel-tabel yang diperlukan oleh Laravel: php artisan migrate Perintah ini akan membuat tabel-tabel dasar seperti users, password_resets, dan failed_jobs di database sewa_kantor_db. Agar proyek bisa dijalankan secara lokal, gunakan perintah berikut untuk menjalankan server Laravel: php artisan serve Server Laravel sekarang berjalan di http://127.0.0.1:8000. Akses URL tersebut di browser untuk melihat tampilan awal proyek Laravel yang baru saja dibuat. Dengan langkah-langkah di atas, proyek website sewa kantor berbasis Laravel 11 sudah siap digunakan sebagai basis pengembangan fitur-fitur lebih lanjut, seperti task scheduling untuk pengelolaan otomatis berbagai tugas rutin. Cara Membuat File Model dan Migration untuk Tabel-Tabel yang Dibutuhkan Untuk membangun fitur-fitur unggulan pada website sewa kantor dengan Laravel, kita memerlukan beberapa tabel penting seperti offices untuk data kantor, bookings untuk data penyewaan, users untuk data penyewa, payments untuk catatan pembayaran, dan activities untuk mencatat aktivitas pengguna. Berikut adalah langkah-langkah membuat model dan migration untuk tabel-tabel tersebut. Pertama, pastikan berada di dalam direktori proyek Laravel yang telah dibuat sebelumnya. Kemudian, gunakan perintah Artisan untuk membuat model dan migration. php artisan make:model Office -m php artisan make:model Booking -m php artisan make:model User -m php artisan make:model Payment -m php artisan make:model Activity -m Perintah di atas akan membuat file model dan migration untuk masing-masing entitas yang diperlukan. Selanjutnya, kita akan mengedit file migration yang terletak di direktori database/migrations. Tabel Offices Untuk tabel offices, tambahkan kolom-kolom yang diperlukan seperti name, location, price, dan availability. Berikut contoh kodingnya: public function up() { Schema::create('offices', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('location'); $table->decimal('price', 10, 2); $table->boolean('availability')->default(true); $table->timestamps(); }); } Tabel Bookings Untuk tabel bookings, tambahkan kolom yang menyimpan informasi tentang penyewa, kantor yang disewa, tanggal mulai, dan tanggal selesai penyewaan. public function up() { Schema::create('bookings', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained('users'); $table->foreignId('office_id')->constrained('offices'); $table->date('start_date'); $table->date('end_date'); $table->timestamps(); }); } Tabel Users Untuk tabel users, Laravel sudah menyediakan migration default. Pastikan tabel ini memiliki kolom-kolom yang diperlukan seperti name, email, dan password. Jika ingin menambahkan kolom lain, edit migration default yang sudah ada. public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } Tabel Payments Untuk tabel payments, tambahkan kolom untuk menyimpan informasi pembayaran seperti booking_id, amount, status, dan payment_date. public function up() { Schema::create('payments', function (Blueprint $table) { $table->id(); $table->foreignId('booking_id')->constrained('bookings'); $table->decimal('amount', 10, 2); $table->string('status'); $table->date('payment_date'); $table->timestamps(); }); } Tabel Activities Tabel activities digunakan untuk mencatat semua aktivitas pengguna di website seperti login, booking, dan pembayaran. public function up() { Schema::create('activities', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained('users'); $table->string('description'); $table->timestamps(); }); } Setelah semua file migration sudah diisi dengan skema tabel yang sesuai, jalankan perintah berikut untuk membuat tabel-tabel tersebut di database: php artisan migrate Dengan demikian, semua tabel yang dibutuhkan untuk fitur-fitur unggulan pada website sewa kantor sudah tersedia di database dan siap digunakan untuk proses pengembangan lebih lanjut. Cara Menerapkan 5 Fitur Utama dengan Task Scheduling Laravel 11 Task scheduling di Laravel 11 memungkinkan kita untuk mengotomatisasi berbagai tugas rutin yang diperlukan untuk menjalankan fitur-fitur utama pada website sewa kantor. Berikut adalah cara menerapkan masing-masing fitur dengan menggunakan task scheduling beserta contoh kodingnya. Pengingat Pembayaran Otomatis Untuk mengingatkan pengguna tentang pembayaran yang akan datang, kita dapat membuat task schedule yang akan mengirimkan email pengingat beberapa hari sebelum tanggal jatuh tempo. Buatlah sebuah command baru untuk mengirim email pengingat: php artisan make:command SendPaymentReminder Kemudian, tambahkan logika pengiriman email di dalam file SendPaymentReminder.php: public function handle() { $bookings = Booking::where('end_date', '>=', now()->subDays(3)) ->where('end_date', '<', now()) ->whereDoesntHave('payments') ->get(); foreach ($bookings as $booking) { Mail::to($booking->user->email)->send(new PaymentReminderMail($booking)); } } Jadwalkan command ini di app/Console/Kernel.php: protected function schedule(Schedule $schedule) { $schedule->command('send:payment-reminder')->daily(); } Pembaruan Ketersediaan Kantor Untuk memperbarui status ketersediaan kantor secara otomatis, buatlah command baru: php artisan make:command UpdateOfficeAvailability Di dalam UpdateOfficeAvailability.php, tambahkan logika untuk memperbarui ketersediaan kantor: public function handle() { $offices = Office::all(); foreach ($offices as $office) { $office->availability = $office->bookings()->where('end_date', '>', now())->count() === 0; $office->save(); } } Jadwalkan command ini agar berjalan setiap malam: protected function schedule(Schedule $schedule) { $schedule->command('update:office-availability')->dailyAt('23:00'); } Laporan Aktivitas Harian Untuk mengirim laporan aktivitas harian kepada admin, buat command baru: php artisan make:command SendDailyActivityReport Tambahkan logika untuk mengirim laporan harian melalui email: public function handle() { $activities = Activity::whereDate('created_at', now()->format('Y-m-d'))->get(); Mail::to('[email protected]')->send(new DailyActivityReportMail($activities)); } Jadwalkan command ini agar berjalan setiap pagi: protected function schedule(Schedule $schedule) { $schedule->command('send:daily-activity-report')->dailyAt('08:00'); } Pengarsipan Data Lama Untuk mengarsipkan data lama, buat command baru: php artisan make:command ArchiveOldBookings Tambahkan logika untuk mengarsipkan data booking lama: public function handle() { $oldBookings = Booking::where('end_date', '<', now()->subYear())->get(); foreach ($oldBookings as $booking) { // Logika pengarsipan, misalnya memindahkan data ke tabel arsip ArchivedBooking::create($booking->toArray()); $booking->delete(); } } Jadwalkan command ini agar berjalan setiap bulan: protected function schedule(Schedule $schedule) { $schedule->command('archive:old-bookings')->monthly(); } Backup Data Rutin Untuk membuat backup data rutin, buat command baru: php artisan make:command BackupDatabase Tambahkan logika untuk melakukan backup database: public function handle() { $filename = "backup-" . now()->format('Y-m-d-H-i-s') . ".sql"; $command = "mysqldump -u root -p'password' sewa_kantor_db > " . storage_path("backups/" . $filename); exec($command); } Jadwalkan command ini agar berjalan setiap malam: protected function schedule(Schedule $schedule) { $schedule->command('backup:database')->dailyAt('02:00'); } Dengan menerapkan task scheduling seperti contoh di atas, kita dapat memastikan bahwa fitur-fitur penting pada website sewa kantor berjalan secara otomatis dan teratur. Ini membantu menjaga pengalaman pengguna yang baik dan mengurangi beban pekerjaan manual. Penutup Laravel akan terus menjadi pilihan utama bagi developer karena selalu menghadirkan update menarik yang memudahkan proses pengembangan web. Fitur-fitur canggih seperti task scheduling tidak hanya meningkatkan efisiensi kerja tetapi juga membuka peluang inovasi dalam proyek yang kita kerjakan. Untuk terus meningkatkan kemampuan dan mengikuti perkembangan terbaru, pantau terus website Buildwithangga. Mereka sering mengupdate kelas gratis dengan studi kasus menarik bersama mentor berpengalaman, serta menawarkan akses kelas seumur hidup. Dengan belajar secara kontinu, kita dapat menjadi developer yang lebih kompeten dan siap menghadapi tantangan di dunia teknologi.

Kelas Tutorial Laravel 11, Filament, Spatie, Midtrans Bikin Website Toko Online Sederhana di BuildWithAngga

Tutorial Laravel 11, Filament, Spatie, Midtrans Bikin Website Toko Online Sederhana

Membangun sebuah website e-commerce bukan hanya tentang bagaimana menampilkan produk dan transaksi pembelian di sisi pengguna (frontend). Sebuah website e-commerce yang baik juga harus memiliki halaman admin yang terstruktur dan efisien untuk memudahkan pengelolaan produk, pesanan, pelanggan, dan laporan penjualan. Dalam artikel ini, kita akan membahas bagaimana cara membuat halaman admin beserta Content Management System (CMS) menggunakan Laravel dan Filament. Pentingnya Halaman Admin yang Terstruktur Bayangkan Anda memiliki sebuah toko fisik dengan berbagai produk yang dijual. Tanpa sistem manajemen yang baik, Anda akan kesulitan melacak stok barang, pesanan yang masuk, atau bahkan detail pelanggan. Hal ini sama pentingnya dengan toko online. Halaman admin yang terstruktur ibarat sebuah kantor pusat yang mengelola segala aktivitas di toko tersebut. Melalui halaman ini, kita bisa melakukan hal-hal seperti: Mengelola Produk: Menambahkan, mengubah, atau menghapus produk dengan mudah.Mengelola Pesanan: Melihat detail pesanan yang masuk, status pengiriman, hingga riwayat transaksi.Mengelola Pelanggan: Melihat data pelanggan, riwayat pembelian, dan preferensi mereka.Laporan Penjualan: Melihat data penjualan harian, mingguan, hingga bulanan untuk analisis lebih lanjut. Dengan halaman admin yang baik, seluruh proses pengelolaan ini bisa dilakukan dengan lebih efisien dan terstruktur. Itulah mengapa penting untuk membangun sistem admin yang user-friendly dan dapat diandalkan. Laravel dan Filament: Kombinasi yang Tepat untuk Membangun CMS Laravel adalah framework PHP yang sangat populer di kalangan developer web. Framework ini menyediakan berbagai fitur yang membuat pengembangan website menjadi lebih mudah dan aman. Beberapa fitur penting dari Laravel yang relevan untuk membangun sistem admin adalah: Eloquent ORM: Membuat interaksi dengan database menjadi lebih sederhana dan mudah dipahami. Anda bisa menggunakan Eloquent untuk membuat, membaca, mengubah, dan menghapus data di database dengan sintaks yang mudah dipahami.Middleware: Digunakan untuk memfilter dan memeriksa permintaan HTTP sebelum mencapai aplikasi. Ini sangat berguna untuk mengamankan halaman admin dengan memeriksa apakah pengguna sudah login dan memiliki akses yang tepat.Policy: Memberikan kontrol akses yang lebih rinci untuk setiap tindakan yang dilakukan di aplikasi. Misalnya, hanya pengguna dengan peran 'Admin' yang bisa menambahkan produk baru. Sementara itu, Filament adalah library yang mempermudah pembuatan dashboard dan halaman admin di Laravel. Filament dilengkapi dengan resource builder yang intuitif, sehingga Anda bisa membuat form, tabel, dan antarmuka admin lainnya dengan cepat tanpa perlu menulis kode dari nol. Berikut beberapa keunggulan Filament: Resource Builder: Dengan fitur ini, Anda bisa membuat halaman admin untuk mengelola data seperti produk, pesanan, atau pelanggan hanya dengan beberapa konfigurasi sederhana.Modular: Filament dirancang secara modular, artinya Anda bisa menambahkan fitur atau modul baru ke dalam dashboard admin Anda dengan mudah.User Interface (UI) yang Intuitif: Filament memberikan UI yang user-friendly dan modern, sehingga mudah digunakan bahkan untuk pengguna yang baru mengenal sistem admin. Mengapa Laravel dan Filament Cocok untuk E-Commerce? Keamanan: Laravel dilengkapi dengan fitur seperti CSRF protection, validasi input, dan manajemen sesi yang membantu menjaga keamanan aplikasi e-commerce Anda. Dengan Filament, Anda juga bisa menambahkan level akses yang lebih rinci pada halaman admin.Kecepatan Pengembangan: Kombinasi Laravel dan Filament memungkinkan pengembangan halaman admin menjadi lebih cepat. Anda tidak perlu membangun dashboard dari nol, cukup gunakan resource builder dari Filament.Kemudahan Maintenance: Dengan struktur MVC (Model-View-Controller) dari Laravel, Anda bisa memisahkan logika bisnis, tampilan, dan data dengan jelas. Filament membantu memisahkan logika tampilan di halaman admin, sehingga lebih mudah dimaintenance. Membuat Projek Laravel Terbaru Menggunakan Composer dan Mengatur Koneksi MySQL Untuk memulai projek Laravel terbaru, kita dapat menggunakan Composer untuk menginstall Laravel beserta dependensinya. Pada langkah-langkah berikut, kita akan belajar cara membuat projek Laravel terbaru menggunakan Composer dan mengatur koneksi MySQL pada file .env. 1. Membuat Projek Laravel dengan Composer Langkah pertama adalah membuat projek Laravel menggunakan perintah composer create-project. Pastikan Composer sudah terinstall di komputer Anda. Jika belum, silakan download dan install Composer dari situs resmi Composer. Buka terminal atau command prompt, lalu jalankan perintah berikut: composer create-project --prefer-dist laravel/laravel nama_projek Gantilah nama_projek dengan nama projek yang ingin Anda buat. Perintah ini akan mengunduh dan menginstall Laravel beserta dependensi yang diperlukan di folder nama_projek. 2. Mengatur Koneksi Database di File .env Setelah proses instalasi selesai, masuk ke folder projek yang baru dibuat: cd nama_projek Di dalam folder projek tersebut, terdapat file .env yang berfungsi untuk menyimpan konfigurasi environment, termasuk pengaturan koneksi database. Berikut adalah cara mengatur koneksi MySQL di file .env: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=root DB_PASSWORD=kata_sandi DB_CONNECTION: Menentukan jenis database yang digunakan. Dalam contoh ini, kita menggunakan mysql.DB_HOST: Alamat host database. Jika MySQL terinstall secara lokal, gunakan 127.0.0.1.DB_PORT: Port yang digunakan untuk koneksi ke MySQL. Secara default, MySQL menggunakan port 3306.DB_DATABASE: Nama database yang akan digunakan untuk projek Laravel ini. Pastikan database ini sudah dibuat di MySQL.DB_USERNAME: Username yang digunakan untuk mengakses database MySQL.DB_PASSWORD: Password yang digunakan untuk mengakses database MySQL. Contoh pengaturan .env untuk koneksi ke database MySQL lokal: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_ecommerce DB_USERNAME=root DB_PASSWORD=password123 Pastikan untuk mengganti DB_DATABASE, DB_USERNAME, dan DB_PASSWORD sesuai dengan pengaturan di MySQL Anda. 3. Menguji Koneksi Database Setelah melakukan pengaturan di file .env, langkah selanjutnya adalah menguji koneksi ke database dengan menjalankan migrasi default dari Laravel. Jalankan perintah berikut di terminal: php artisan migrate Jika tidak ada error, berarti koneksi ke database berhasil dan tabel-tabel default Laravel berhasil dibuat. Jika terdapat error, periksa kembali pengaturan di file .env dan pastikan database MySQL Anda sudah berjalan. 4. Contoh Kode Lengkap Berikut adalah contoh file .env lengkap setelah pengaturan koneksi database: APP_NAME=Laravel APP_ENV=local APP_KEY=base64:....... APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_ecommerce DB_USERNAME=root DB_PASSWORD=password123 BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="[email protected]" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" Dalam contoh ini, konfigurasi yang perlu diperhatikan adalah bagian DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, dan DB_PASSWORD. Pastikan nilai-nilai ini sesuai dengan pengaturan MySQL Anda. Membuat File Migration dan Model untuk Tabel E-Commerce di Laravel Dalam sebuah proyek e-commerce, kita memerlukan beberapa tabel seperti products, categories, customers, dan orders. Setiap tabel ini akan saling berhubungan melalui relasi Eloquent seperti hasMany, belongsTo, dan belongsToMany. Langkah-langkah berikut akan menjelaskan cara membuat file migration dan model untuk setiap tabel, menambahkan properti fillable, serta mengatur hubungan antar tabel menggunakan Artisan command dan metode Eloquent. Membuat Migration untuk Tabel E-Commerce Untuk membuat file migration, gunakan perintah Artisan make:migration yang akan membuat file migration baru di dalam folder database/migrations. Tabel Categories Mulai dengan membuat tabel categories untuk menyimpan informasi kategori produk: php artisan make:migration create_categories_table --create=categories Isi file migration create_categories_table: Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); // Nama kategori unik $table->timestamps(); }); Tabel Products Lanjutkan dengan membuat tabel products untuk menyimpan data produk: php artisan make:migration create_products_table --create=products Isi file migration create_products_table: Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); // Nama produk $table->text('description')->nullable(); // Deskripsi produk, bisa null $table->decimal('price', 8, 2); // Harga produk $table->integer('stock'); // Stok produk $table->foreignId('category_id')->constrained()->onDelete('cascade'); // Relasi ke tabel categories $table->timestamps(); }); Tabel Customers Selanjutnya, buat tabel customers untuk menyimpan data pelanggan: php artisan make:migration create_customers_table --create=customers Isi file migration create_customers_table: Schema::create('customers', function (Blueprint $table) { $table->id(); $table->string('name'); // Nama pelanggan $table->string('email')->unique(); // Email pelanggan unik $table->string('phone'); // Nomor telepon pelanggan $table->text('address'); // Alamat pelanggan $table->timestamps(); }); Tabel Orders Terakhir, buat tabel orders untuk menyimpan data pesanan: php artisan make:migration create_orders_table --create=orders Isi file migration create_orders_table: Schema::create('orders', function (Blueprint $table) { $table->id(); $table->foreignId('customer_id')->constrained()->onDelete('cascade'); // Relasi ke tabel customers $table->decimal('total_price', 10, 2); // Total harga pesanan $table->string('status')->default('pending'); // Status pesanan, default 'pending' $table->timestamps(); }); Jalankan semua migration yang telah dibuat dengan perintah: php artisan migrate Membuat Model dan Menambahkan Properti Fillable Setelah membuat migration, kita perlu membuat model untuk setiap tabel. Tambahkan properti fillable pada setiap model untuk mengatur atribut apa saja yang bisa diisi secara massal. Model Category Buat model untuk tabel categories: php artisan make:model Category Isi file model Category.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { use HasFactory; protected $fillable = [ 'name', // Atribut yang bisa diisi secara massal ]; public function products() { return $this->hasMany(Product::class); // Satu kategori memiliki banyak produk } } Model Product Buat model untuk tabel products: php artisan make:model Product Isi file model Product.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Product extends Model { use HasFactory; protected $fillable = [ 'name', 'description', 'price', 'stock', 'category_id' ]; public function category() { return $this->belongsTo(Category::class); // Produk ini milik satu kategori } public function orders() { return $this->belongsToMany(Order::class, 'order_product')->withPivot('quantity'); // Produk bisa ada di banyak pesanan } } Model Customer Buat model untuk tabel customers: php artisan make:model Customer Isi file model Customer.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Customer extends Model { use HasFactory; protected $fillable = [ 'name', 'email', 'phone', 'address' ]; public function orders() { return $this->hasMany(Order::class); // Pelanggan bisa memiliki banyak pesanan } } Model Order Buat model untuk tabel orders: php artisan make:model Order Isi file model Order.php: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Order extends Model { use HasFactory; protected $fillable = [ 'customer_id', 'total_price', 'status' ]; public function customer() { return $this->belongsTo(Customer::class); // Pesanan ini milik satu pelanggan } public function products() { return $this->belongsToMany(Product::class, 'order_product')->withPivot('quantity'); // Pesanan bisa memiliki banyak produk } } Mengatur Relasi Antar Tabel Berikut adalah penjelasan tentang bagaimana mengatur relasi antar tabel menggunakan Eloquent: Category memiliki relasi hasMany ke Product, artinya satu kategori dapat memiliki banyak produk.Product memiliki relasi belongsTo ke Category, artinya setiap produk hanya dimiliki oleh satu kategori.Customer memiliki relasi hasMany ke Order, artinya satu pelanggan dapat membuat banyak pesanan.Order memiliki relasi belongsTo ke Customer, artinya setiap pesanan hanya dimiliki oleh satu pelanggan.Product dan Order memiliki relasi belongsToMany melalui tabel pivot order_product, artinya satu produk bisa ada di banyak pesanan, dan satu pesanan bisa memiliki banyak produk. Cara Menginstall Package Filament dan Membuat Akun Admin Filament adalah paket Laravel yang memudahkan pembuatan dashboard dan Content Management System (CMS) dengan antarmuka yang modern dan fitur-fitur yang lengkap. Berikut adalah langkah-langkah untuk menginstall Filament, membuat akun admin, serta mengonfigurasi user sebagai admin. Menginstall Package Filament Mulailah dengan menginstall package Filament menggunakan Composer. Buka terminal atau command prompt di direktori proyek Laravel Anda, kemudian jalankan perintah berikut: composer require filament/filament Perintah ini akan mengunduh dan menginstal package Filament beserta semua dependensi yang diperlukan ke dalam proyek Laravel Anda. Menjalankan Migrasi Setelah menginstall Filament, Anda perlu menjalankan migrasi untuk membuat tabel yang diperlukan oleh Filament. Tabel ini digunakan untuk menyimpan data user dan manajemen dashboard. php artisan migrate Perintah ini akan membuat tabel-tabel yang dibutuhkan Filament, seperti users, password_resets, dan lainnya di dalam database. Membuat Akun Admin dengan Filament Filament menyediakan perintah khusus untuk membuat akun admin secara cepat. Gunakan perintah berikut untuk membuat user baru yang akan digunakan sebagai admin: php artisan make:filament-user Perintah ini akan meminta Anda untuk memasukkan informasi berikut: Nama user (misalnya Admin User)Alamat email (misalnya [email protected])Kata sandiOpsi untuk menetapkan user sebagai super admin (ketik yes untuk memberikan akses penuh kepada user ini) Berikut contoh tampilan interaktif di terminal: Name: Admin User Email: [email protected] Password: Super Admin: yes Jika Anda memilih yes untuk super admin, user ini akan memiliki semua izin yang tersedia di dashboard Filament. Konfigurasi Akun Admin Setelah membuat akun admin, Anda perlu mengatur middleware agar user ini dapat mengakses dashboard Filament. Secara default, Filament menggunakan middleware filament untuk memverifikasi apakah user memiliki izin untuk mengakses dashboard. Pastikan middleware ini sudah dikonfigurasi dengan benar. Berikut adalah langkah-langkah yang perlu dilakukan untuk mengonfigurasi user sebagai admin: Buka file config/filament.php di proyek Laravel Anda.Temukan bagian auth.guard dan pastikan guard yang digunakan adalah web: 'auth' => [ 'guard' => 'web', ],Temukan bagian auth.providers.users.model dan pastikan model yang digunakan adalah App\\\\Models\\\\User atau model user yang Anda gunakan: 'auth' => [ 'providers' => [ 'users' => [ 'model' => App\\\\Models\\\\User::class, ], ], ], Pastikan juga bahwa user yang Anda buat memiliki akses ke dashboard Filament. Jika Anda menggunakan Role dan Permission, pastikan bahwa user tersebut memiliki role admin atau izin yang sesuai untuk mengakses halaman dashboard. Mengakses Dashboard Filament Setelah melakukan konfigurasi, Anda dapat mengakses dashboard Filament melalui URL berikut: <http://localhost/admin> Masukkan email dan password yang telah Anda buat menggunakan perintah make:filament-user. Jika login berhasil, Anda akan masuk ke dashboard Filament yang berisi antarmuka untuk mengelola data. Membuat Resource untuk CRUD di Filament Untuk mengelola data dari tabel-tabel yang telah dibuat seperti products, categories, customers, dan orders, kita bisa menggunakan fitur resource dari Filament. Filament memudahkan pembuatan halaman CRUD (Create, Read, Update, Delete) melalui dashboard admin dengan menggunakan command php artisan make:filament-resource. Berikut ini adalah langkah-langkah lengkap untuk membuat resource pada setiap tabel beserta contoh kode konfigurasi fields, forms, dan tables. Membuat Resource untuk Setiap Tabel Setiap resource akan merepresentasikan satu tabel di dalam aplikasi e-commerce kita. Gunakan perintah php artisan make:filament-resource untuk membuat resource ini. Membuat Resource untuk Tabel Categories php artisan make:filament-resource Category Resource ini akan menghasilkan beberapa file utama, termasuk file CategoryResource.php yang mengatur bagaimana resource ini ditampilkan di dashboard admin. Isi file app/Filament/Resources/CategoryResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CategoryResource\\\\Pages; use App\\\\Models\\\\Category; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class CategoryResource extends Resource { protected static ?string $model = Category::class; protected static ?string $navigationIcon = 'heroicon-o-tag'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCategories::route('/'), 'create' => Pages\\\\CreateCategory::route('/create'), 'edit' => Pages\\\\EditCategory::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Products php artisan make:filament-resource Product Isi file app/Filament/Resources/ProductResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\ProductResource\\\\Pages; use App\\\\Models\\\\Product; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class ProductResource extends Resource { protected static ?string $model = Product::class; protected static ?string $navigationIcon = 'heroicon-o-shopping-bag'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\Textarea::make('description') ->maxLength(65535), Forms\\\\Components\\\\TextInput::make('price') ->numeric() ->required(), Forms\\\\Components\\\\TextInput::make('stock') ->numeric() ->required(), Forms\\\\Components\\\\Select::make('category_id') ->relationship('category', 'name') ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('stock')->sortable(), Tables\\\\Columns\\\\TextColumn::make('category.name')->label('Category'), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListProducts::route('/'), 'create' => Pages\\\\CreateProduct::route('/create'), 'edit' => Pages\\\\EditProduct::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Customers php artisan make:filament-resource Customer Isi file app/Filament/Resources/CustomerResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CustomerResource\\\\Pages; use App\\\\Models\\\\Customer; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class CustomerResource extends Resource { protected static ?string $model = Customer::class; protected static ?string $navigationIcon = 'heroicon-o-user-group'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\TextInput::make('email') ->email() ->required() ->maxLength(255), Forms\\\\Components\\\\TextInput::make('phone') ->tel() ->maxLength(20) ->required(), Forms\\\\Components\\\\Textarea::make('address') ->maxLength(65535) ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('email')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('phone')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListCustomers::route('/'), 'create' => Pages\\\\CreateCustomer::route('/create'), 'edit' => Pages\\\\EditCustomer::route('/{record}/edit'), ]; } } Membuat Resource untuk Tabel Orders php artisan make:filament-resource Order Isi file app/Filament/Resources/OrderResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\OrderResource\\\\Pages; use App\\\\Models\\\\Order; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class OrderResource extends Resource { protected static ?string $model = Order::class; protected static ?string $navigationIcon = 'heroicon-o-shopping-cart'; // Ikon untuk menu navigasi public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\Select::make('customer_id') ->relationship('customer', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('total_price') ->numeric() ->required(), Forms\\\\Components\\\\Select::make('status') ->options([ 'pending' => 'Pending', 'completed' => 'Completed', 'cancelled' => 'Cancelled', ]) ->required(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('customer.name')->label('Customer')->sortable(), Tables\\\\Columns\\\\TextColumn::make('total_price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('status')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListOrders::route('/'), 'create' => Pages\\\\CreateOrder::route('/create'), 'edit' => Pages\\\\EditOrder::route('/{record}/edit'), ]; } } Mengatur Fields, Forms, dan Tables untuk Setiap Resource Fields: Digunakan untuk mendefinisikan form input yang akan digunakan ketika menambahkan atau mengedit data. Contohnya adalah Forms\\\\Components\\\\TextInput::make('name') untuk field name. Forms: Berfungsi untuk mendefinisikan form schema yang ditampilkan pada halaman create dan edit. Contohnya: Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255) Tables: Digunakan untuk mendefinisikan kolom yang akan ditampilkan pada tabel daftar data. Contohnya: Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable() Setiap resource memiliki form dan table yang dikonfigurasikan sesuai kebutuhan untuk mengel ola data dari tabel yang bersangkutan di halaman admin. Menambahkan Fitur Authentication Menggunakan Laravel Breeze atau Fortify Laravel Breeze dan Fortify adalah solusi bawaan Laravel untuk menambahkan fitur autentikasi seperti login, register, dan manajemen pengguna. Keduanya menawarkan cara yang efisien untuk mengamankan akses ke halaman admin. Berikut adalah langkah-langkah instalasi, konfigurasi, serta penambahan login dan register form untuk memastikan hanya pengguna yang memiliki izin yang dapat mengakses halaman admin. Menggunakan Laravel Breeze Instalasi Laravel Breeze Laravel Breeze menyediakan implementasi autentikasi yang sederhana dan cepat. Untuk menginstal Laravel Breeze, pertama-tama pastikan Anda berada di direktori proyek Laravel, lalu jalankan perintah berikut: composer require laravel/breeze --dev Setelah instalasi selesai, jalankan perintah untuk menginstall scaffolding Breeze: php artisan breeze:install Perintah ini akan menambahkan file-file yang diperlukan untuk fitur autentikasi seperti halaman login, register, dan dashboard pengguna. Jalankan Migrasi Setelah menginstall Breeze, jalankan migrasi untuk membuat tabel users dan password_resets: php artisan migrate Install Dependensi Frontend Laravel Breeze menggunakan Tailwind CSS untuk styling frontend. Jalankan perintah berikut untuk menginstall dependensi frontend dan membangun aplikasi: npm install && npm run dev Mengatur Middleware untuk Mengamankan Halaman Admin Untuk memastikan hanya pengguna yang sudah login yang dapat mengakses halaman admin, gunakan middleware auth pada route admin di file routes/web.php: Route::middleware(['auth'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); // Route lainnya yang perlu diamankan }); Dengan middleware auth, Laravel akan memverifikasi apakah pengguna sudah login sebelum mengizinkan akses ke halaman admin. Konfigurasi Redirect Setelah Login Untuk mengarahkan pengguna ke halaman admin setelah login, buka file App\\\\Providers\\\\RouteServiceProvider.php dan ubah properti HOME menjadi URL halaman admin: public const HOME = '/admin'; Menggunakan Laravel Fortify Laravel Fortify adalah backend authentication scaffolding yang lebih fleksibel. Ini memberikan kontrol penuh untuk mengatur logika autentikasi tanpa dependensi frontend. Instalasi Laravel Fortify Untuk menginstall Fortify, jalankan perintah berikut di terminal: composer require laravel/fortify Publikasikan file konfigurasi Fortify dengan perintah berikut: php artisan vendor:publish --provider="Laravel\\\\Fortify\\\\FortifyServiceProvider" Ini akan menghasilkan file konfigurasi di config/fortify.php. Aktifkan Fitur Autentikasi Di dalam file config/fortify.php, aktifkan fitur-fitur yang dibutuhkan seperti login dan register dengan menambahkan: 'features' => [ Features::registration(), Features::resetPasswords(), Features::emailVerification(), Features::updateProfileInformation(), Features::updatePasswords(), Features::twoFactorAuthentication(), ], Jalankan Migrasi Fortify menggunakan tabel users dan password_resets. Pastikan tabel-tabel ini sudah ada di database dengan menjalankan migrasi: php artisan migrate Mengatur View untuk Login dan Register Untuk menambahkan form login dan register, buat file login.blade.php dan register.blade.php di dalam folder resources/views/auth. Contoh form login sederhana: <form method="POST" action="{{ route('login') }}"> @csrf <div> <label for="email">Email</label> <input id="email" type="email" name="email" required autofocus> </div> <div> <label for="password">Password</label> <input id="password" type="password" name="password" required> </div> <button type="submit">Login</button> </form> Contoh form register sederhana: <form method="POST" action="{{ route('register') }}"> @csrf <div> <label for="name">Name</label> <input id="name" type="text" name="name" required autofocus> </div> <div> <label for="email">Email</label> <input id="email" type="email" name="email" required> </div> <div> <label for="password">Password</label> <input id="password" type="password" name="password" required> </div> <button type="submit">Register</button> </form> Menggunakan Middleware untuk Mengamankan Halaman Admin Tambahkan middleware auth pada route admin di file routes/web.php untuk memastikan hanya pengguna yang sudah login yang dapat mengakses halaman admin: Route::middleware(['auth'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); }); Konfigurasi Guard untuk Admin Untuk membatasi akses admin dengan lebih spesifik, Anda bisa menambahkan guard baru di file config/auth.php: 'guards' => [ 'admin' => [ 'driver' => 'session', 'provider' => 'users', ], ], Lalu, pastikan middleware auth:admin digunakan pada route admin: Route::middleware(['auth:admin'])->group(function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); }); Mengatur Role dan Permission Menggunakan Spatie Laravel Permission Untuk mengelola akses pengguna dengan lebih terperinci di aplikasi Laravel, kita bisa menggunakan package Spatie Laravel Permission. Package ini memungkinkan kita untuk mengatur role dan permission agar hanya pengguna tertentu yang memiliki akses ke fitur atau halaman tertentu. Dalam panduan ini, akan dijelaskan cara mengatur role seperti admin, product_manager, sales_staff, dan customer, serta menetapkan izin (permission) untuk masing-masing role beserta contoh koding lengkap. Instalasi Spatie Laravel Permission Mulailah dengan menginstal package Spatie Laravel Permission melalui Composer: composer require spatie/laravel-permission Setelah terinstal, jalankan perintah untuk mempublikasikan konfigurasi dan migrasi: php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider" Perintah ini akan membuat file konfigurasi config/permission.php dan migrasi untuk tabel roles, permissions, dan model_has_roles. Jalankan migrasi untuk membuat tabel-tabel tersebut: php artisan migrate Menambahkan Trait HasRoles ke Model User Untuk menggunakan fitur role dan permission pada model User, tambahkan trait HasRoles dari package Spatie di model User: namespace App\\\\Models; use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable; use Spatie\\\\Permission\\\\Traits\\\\HasRoles; class User extends Authenticatable { use HasRoles; // properti dan metode lainnya } Trait HasRoles ini memungkinkan model User untuk menggunakan metode seperti assignRole, hasRole, givePermissionTo, dan lainnya. Membuat Role dan Permission Gunakan seeder untuk membuat role dan permission pertama kali. Buat file seeder dengan perintah: php artisan make:seeder RolePermissionSeeder Isi file seeder RolePermissionSeeder.php seperti berikut: namespace Database\\\\Seeders; use Illuminate\\\\Database\\\\Seeder; use Spatie\\\\Permission\\\\Models\\\\Permission; use Spatie\\\\Permission\\\\Models\\\\Role; class RolePermissionSeeder extends Seeder { public function run() { // Membuat permission Permission::create(['name' => 'manage products']); Permission::create(['name' => 'manage categories']); Permission::create(['name' => 'manage orders']); Permission::create(['name' => 'view orders']); Permission::create(['name' => 'manage users']); // Membuat role Admin dan memberikan semua permission $admin = Role::create(['name' => 'admin']); $admin->givePermissionTo(Permission::all()); // Membuat role Product Manager dan memberikan permission terkait produk dan kategori $productManager = Role::create(['name' => 'product_manager']); $productManager->givePermissionTo(['manage products', 'manage categories']); // Membuat role Sales Staff dan memberikan permission terkait pesanan $salesStaff = Role::create(['name' => 'sales_staff']); $salesStaff->givePermissionTo(['view orders', 'manage orders']); // Membuat role Customer tanpa permission Role::create(['name' => 'customer']); } } Jalankan seeder untuk memasukkan data role dan permission ke database: php artisan db:seed --class=RolePermissionSeeder Seeder ini akan membuat role dan permission yang dibutuhkan serta menghubungkannya. Mengatur Role pada User Setelah role dan permission dibuat, Anda dapat memberikan role kepada pengguna. Misalnya, untuk membuat pengguna dengan role admin, gunakan contoh kode berikut di seeder atau di controller: use App\\\\Models\\\\User; use Spatie\\\\Permission\\\\Models\\\\Role; // Misalkan ini adalah user yang sudah terdaftar $adminUser = User::find(1); $adminUser->assignRole('admin'); $productManagerUser = User::find(2); $productManagerUser->assignRole('product_manager'); $salesStaffUser = User::find(3); $salesStaffUser->assignRole('sales_staff'); Dengan menggunakan metode assignRole, pengguna akan diberikan role yang sesuai. Middleware untuk Mengamankan Route Berdasarkan Role Untuk mengamankan route dengan role dan permission, gunakan middleware role atau permission yang disediakan oleh package Spatie. Contoh untuk mengamankan route agar hanya admin yang bisa mengakses: Route::group(['middleware' => ['role:admin']], function () { Route::get('/admin', [AdminController::class, 'index'])->name('admin.index'); // Tambahkan route lain yang hanya bisa diakses oleh admin }); Untuk memberikan akses hanya kepada product_manager atau sales_staff, gunakan: Route::group(['middleware' => ['role:product_manager|sales_staff']], function () { Route::get('/orders', [OrderController::class, 'index'])->name('orders.index'); }); Dengan middleware ini, hanya pengguna dengan role product_manager atau sales_staff yang dapat mengakses halaman daftar pesanan. Middleware Permission untuk Mengakses Halaman Tertentu Jika ingin membatasi akses berdasarkan izin (permission), gunakan middleware permission: Route::group(['middleware' => ['permission:manage products']], function () { Route::get('/products', [ProductController::class, 'index'])->name('products.index'); Route::get('/products/create', [ProductController::class, 'create'])->name('products.create'); // Route lain yang membutuhkan izin 'manage products' }); Pengguna dengan izin manage products dapat mengakses halaman ini, tanpa memandang role-nya. Menampilkan Role dan Permission di Halaman Admin Untuk memberikan kontrol penuh kepada admin dalam mengelola role dan permission, Anda bisa membuat CRUD untuk role dan permission menggunakan resource Filament. Berikut adalah contoh untuk menampilkan role di halaman admin: namespace App\\\\Filament\\\\Resources; use Spatie\\\\Permission\\\\Models\\\\Role; use Filament\\\\Forms; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Tables; class RoleResource extends Resource { protected static ?string $model = Role::class; protected static ?string $navigationIcon = 'heroicon-o-shield-check'; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\Select::make('permissions') ->multiple() ->relationship('permissions', 'name') ->preload(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('name')->sortable(), Tables\\\\Columns\\\\TextColumn::make('permissions.name')->label('Permissions')->wrap(), ]) ->filters([ // ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListRoles::route('/'), 'create' => Pages\\\\CreateRole::route('/create'), 'edit' => Pages\\\\EditRole::route('/{record}/edit'), ]; } } Dengan resource ini, admin dapat melihat, menambah, dan mengedit role serta mengatur permission untuk masing-masing role melalui dashboard. Integrasi Payment Gateway dengan Midtrans untuk Memproses Pembayaran Integrasi dengan payment gateway seperti Midtrans memungkinkan aplikasi Laravel Anda untuk memproses pembayaran secara langsung dari halaman checkout atau mengelola transaksi melalui halaman admin. Berikut adalah panduan lengkap untuk melakukan integrasi Midtrans, mulai dari instalasi hingga pengelolaan pembayaran melalui halaman admin. Instalasi SDK Midtrans Untuk memulai integrasi dengan Midtrans, pertama-tama pastikan package midtrans/midtrans-php sudah terpasang di proyek Laravel Anda. Anda bisa menginstalnya melalui Composer: composer require midtrans/midtrans-php Package ini akan membantu dalam berkomunikasi dengan API Midtrans untuk memproses pembayaran. Konfigurasi Midtrans Buat file konfigurasi midtrans.php di direktori config untuk menyimpan kredensial dan pengaturan API Midtrans: return [ 'merchant_id' => env('MIDTRANS_MERCHANT_ID'), 'client_key' => env('MIDTRANS_CLIENT_KEY'), 'server_key' => env('MIDTRANS_SERVER_KEY'), 'is_production' => env('MIDTRANS_PRODUCTION', false), 'is_sanitized' => env('MIDTRANS_SANITIZED', true), 'is_3ds' => env('MIDTRANS_3DS', true), ]; Tambahkan variabel konfigurasi berikut ke file .env Anda: MIDTRANS_MERCHANT_ID=your_merchant_id MIDTRANS_CLIENT_KEY=your_client_key MIDTRANS_SERVER_KEY=your_server_key MIDTRANS_PRODUCTION=false MIDTRANS_SANITIZED=true MIDTRANS_3DS=true Pengaturan ini memastikan bahwa aplikasi Anda dapat berkomunikasi dengan API Midtrans menggunakan kredensial yang benar. Membuat Fungsi untuk Memproses Pembayaran Buat sebuah controller baru untuk memproses pembayaran, misalnya PaymentController. Controller ini akan menangani permintaan pembayaran dari halaman checkout dan mengirimkan data ke Midtrans. namespace App\\\\Http\\\\Controllers; use Illuminate\\\\Http\\\\Request; use Midtrans\\\\Config; use Midtrans\\\\Snap; use App\\\\Models\\\\Order; class PaymentController extends Controller { public function processPayment(Request $request) { // Konfigurasi Midtrans Config::$serverKey = config('midtrans.server_key'); Config::$isProduction = config('midtrans.is_production'); Config::$isSanitized = config('midtrans.is_sanitized'); Config::$is3ds = config('midtrans.is_3ds'); // Mendapatkan data order dari database $order = Order::find($request->order_id); // Parameter yang dikirim ke Midtrans $params = [ 'transaction_details' => [ 'order_id' => $order->id, 'gross_amount' => $order->total_price, ], 'customer_details' => [ 'first_name' => $order->customer->name, 'email' => $order->customer->email, 'phone' => $order->customer->phone, ], 'item_details' => [ [ 'id' => 'product-' . $order->product_id, 'price' => $order->product->price, 'quantity' => $order->quantity, 'name' => $order->product->name, ], ], ]; try { // Mendapatkan Snap Token dari Midtrans $snapToken = Snap::getSnapToken($params); // Menampilkan halaman checkout dengan Snap Token return view('payment.checkout', ['snapToken' => $snapToken, 'order' => $order]); } catch (\\\\Exception $e) { return back()->with('error', 'Gagal memproses pembayaran: ' . $e->getMessage()); } } public function handleNotification(Request $request) { // Logika untuk menangani notifikasi dari Midtrans } } Pada fungsi processPayment, data order dikirim ke Midtrans untuk mendapatkan Snap Token yang akan digunakan untuk menampilkan halaman pembayaran. Simpan Snap Token ini dan gunakan pada halaman checkout. Membuat Halaman Checkout Buat file view resources/views/payment/checkout.blade.php untuk menampilkan halaman checkout dengan widget Snap Midtrans: @extends('layouts.app') @section('content') <h1>Checkout</h1> <p>Order ID: {{ $order->id }}</p> <p>Total Pembayaran: Rp {{ number_format($order->total_price, 0, ',', '.') }}</p> <button id="pay-button">Bayar Sekarang</button> <script type="text/javascript" src="<https://app.sandbox.midtrans.com/snap/snap.js>" data-client-key="{{ config('midtrans.client_key') }}"></script> <script type="text/javascript"> var payButton = document.getElementById('pay-button'); payButton.addEventListener('click', function () { window.snap.pay('{{ $snapToken }}', { onSuccess: function (result) { alert("Pembayaran berhasil!"); console.log(result); }, onPending: function (result) { alert("Menunggu pembayaran!"); console.log(result); }, onError: function (result) { alert("Pembayaran gagal!"); console.log(result); }, onClose: function () { alert('Anda menutup pop-up tanpa menyelesaikan pembayaran'); } }); }); </script> @endsection Widget Snap dari Midtrans akan membuka pop-up untuk memproses pembayaran ketika tombol "Bayar Sekarang" ditekan. Pop-up ini memungkinkan pengguna untuk menyelesaikan transaksi dengan berbagai metode pembayaran yang disediakan oleh Midtrans. Mengelola Pembayaran Melalui Halaman Admin Untuk mengelola pembayaran dari halaman admin, Anda dapat membuat resource baru menggunakan Filament untuk menampilkan data order dan status pembayaran. Misalnya, buat resource OrderResource untuk mengelola pesanan dan statusnya: namespace App\\\\Filament\\\\Resources; use App\\\\Models\\\\Order; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Form; use Filament\\\\Resources\\\\Table; use Filament\\\\Forms; use Filament\\\\Tables; class OrderResource extends Resource { protected static ?string $model = Order::class; protected static ?string $navigationIcon = 'heroicon-o-clipboard-list'; public static function form(Form $form): Form { return $form ->schema([ Forms\\\\Components\\\\TextInput::make('id')->disabled(), Forms\\\\Components\\\\TextInput::make('customer_name')->disabled(), Forms\\\\Components\\\\TextInput::make('status'), Forms\\\\Components\\\\TextInput::make('total_price')->disabled(), Forms\\\\Components\\\\Textarea::make('note'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('customer.name')->label('Customer'), Tables\\\\Columns\\\\TextColumn::make('status')->sortable(), Tables\\\\Columns\\\\TextColumn::make('total_price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ]) ->filters([ // Tambahkan filter status pembayaran jika diperlukan ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ListOrders::route('/'), 'edit' => Pages\\\\EditOrder::route('/{record}/edit'), ]; } } Dengan resource ini, Anda dapat melihat daftar pesanan, mengubah status pembayaran, dan memberikan catatan pada setiap pesanan melalui halaman admin. Menangani Notifikasi dari Midtrans Midtrans menyediakan fitur notifikasi untuk memberi tahu server Anda ketika status transaksi berubah (misalnya, pembayaran berhasil atau gagal). Tambahkan route di file routes/web.php untuk menangani notifikasi ini: Route::post('/payment/notification', [PaymentController::class, 'handleNotification']); Di dalam fungsi handleNotification pada PaymentController, Anda bisa menangani notifikasi ini dan memperbarui status pembayaran di database: public function handleNotification(Request $request) { $notification = $request->all(); // Logika untuk memperbarui status pesanan berdasarkan notifikasi $order = Order::find($notification['order_id']); if ($notification['transaction_status'] == 'settlement') { $order->status = 'paid'; } elseif ($notification['transaction_status'] == 'cancel' || $notification['transaction_status'] == 'deny' || $notification['transaction_status'] == 'expire') { $order->status = 'failed'; } $order->save(); return response()->json(['status' => 'success']); } Fungsi ini akan menerima notifikasi dari Midtrans dan memperbarui status pesanan di database sesuai dengan status pembayaran yang diterima. Menambahkan Fitur Notifikasi Email Otomatis di Laravel Fitur notifikasi email otomatis sangat penting untuk menginformasikan pengguna ketika ada pesanan baru, perubahan status pesanan, atau pengingat untuk menyelesaikan pembayaran. Laravel menyediakan fitur Mailable yang memungkinkan kita untuk mengirim email secara dinamis berdasarkan event tertentu. Berikut adalah panduan lengkap untuk membuat email template menggunakan Mailable dan mengatur pengiriman email berdasarkan event seperti perubahan status pesanan. Mengatur Konfigurasi Mail di Laravel Pastikan konfigurasi mail di Laravel sudah diatur dengan benar di file .env: MAIL_MAILER=smtp MAIL_HOST=smtp.example.com MAIL_PORT=587 [email protected] MAIL_PASSWORD=your_password MAIL_ENCRYPTION=tls [email protected] MAIL_FROM_NAME="${APP_NAME}" Jika Anda menggunakan layanan email seperti Gmail, pastikan MAIL_HOST disesuaikan menjadi smtp.gmail.com, dan MAIL_PORT diatur ke 587 atau 465 dengan MAIL_ENCRYPTION yang sesuai (tls atau ssl). Membuat Email Template dengan Mailable Laravel menyediakan fitur Mailable untuk membuat template email. Gunakan perintah berikut untuk membuat Mailable: php artisan make:mail OrderStatusChanged Ini akan membuat file OrderStatusChanged.php di direktori app/Mail. Buka file tersebut dan atur sesuai kebutuhan: namespace App\\\\Mail; use App\\\\Models\\\\Order; use Illuminate\\\\Bus\\\\Queueable; use Illuminate\\\\Mail\\\\Mailable; use Illuminate\\\\Queue\\\\SerializesModels; class OrderStatusChanged extends Mailable { use Queueable, SerializesModels; public $order; public function __construct(Order $order) { $this->order = $order; } public function build() { return $this->subject('Status Pesanan Anda Telah Berubah') ->view('emails.order-status') ->with([ 'order_id' => $this->order->id, 'status' => $this->order->status, 'customer_name' => $this->order->customer->name, ]); } } Di sini, kita mengirimkan objek Order ke dalam email template dan menggunakan metode build() untuk menentukan subject email dan view yang akan digunakan. Membuat View untuk Template Email Buat file view order-status.blade.php di direktori resources/views/emails: <!DOCTYPE html> <html> <head> <title>Status Pesanan Berubah</title> </head> <body> <h1>Halo, {{ $customer_name }}</h1> <p>Pesanan Anda dengan ID <strong>{{ $order_id }}</strong> sekarang berstatus: <strong>{{ $status }}</strong>.</p> <p>Terima kasih telah berbelanja di toko kami. Jika ada pertanyaan, jangan ragu untuk menghubungi kami.</p> <p>Salam,<br>{{ config('app.name') }}</p> </body> </html> Template ini akan digunakan untuk menampilkan email yang berisi informasi mengenai perubahan status pesanan. Mengirim Email Berdasarkan Event Untuk mengirim email berdasarkan event tertentu, misalnya ketika status pesanan berubah, kita bisa menggunakan Event dan Listener di Laravel. Buat event baru dengan perintah: php artisan make:event OrderStatusUpdated Buka file event OrderStatusUpdated.php yang baru dibuat dan tambahkan properti order: namespace App\\\\Events; use App\\\\Models\\\\Order; use Illuminate\\\\Foundation\\\\Events\\\\Dispatchable; use Illuminate\\\\Queue\\\\SerializesModels; class OrderStatusUpdated { use Dispatchable, SerializesModels; public $order; public function __construct(Order $order) { $this->order = $order; } } Buat listener untuk menangani event ini dengan perintah: php artisan make:listener SendOrderStatusChangedEmail Di dalam listener SendOrderStatusChangedEmail.php, kirim email menggunakan Mailable yang telah dibuat sebelumnya: namespace App\\\\Listeners; use App\\\\Events\\\\OrderStatusUpdated; use App\\\\Mail\\\\OrderStatusChanged; use Illuminate\\\\Contracts\\\\Queue\\\\ShouldQueue; use Illuminate\\\\Support\\\\Facades\\\\Mail; class SendOrderStatusChangedEmail implements ShouldQueue { public function handle(OrderStatusUpdated $event) { $order = $event->order; // Mengirim email menggunakan Mailable Mail::to($order->customer->email)->send(new OrderStatusChanged($order)); } } Di listener ini, kita menggunakan facade Mail untuk mengirim email ke customer berdasarkan event OrderStatusUpdated. Menghubungkan Event dan Listener Pastikan event dan listener yang telah dibuat dihubungkan dalam file EventServiceProvider.php di app/Providers: namespace App\\\\Providers; use App\\\\Events\\\\OrderStatusUpdated; use App\\\\Listeners\\\\SendOrderStatusChangedEmail; use Illuminate\\\\Foundation\\\\Support\\\\Providers\\\\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { protected $listen = [ OrderStatusUpdated::class => [ SendOrderStatusChangedEmail::class, ], ]; public function boot() { parent::boot(); } } Dengan konfigurasi ini, setiap kali event OrderStatusUpdated dipanggil, listener SendOrderStatusChangedEmail akan menangani pengiriman email. Memicu Event saat Status Pesanan Berubah Di dalam model Order atau di controller tempat Anda mengubah status pesanan, panggil event OrderStatusUpdated setiap kali status pesanan diperbarui: use App\\\\Events\\\\OrderStatusUpdated; $order->status = 'shipped'; $order->save(); // Memicu event setelah status pesanan diperbarui event(new OrderStatusUpdated($order)); Dengan memicu event ini, Laravel akan secara otomatis menjalankan listener yang terhubung dan mengirimkan email notifikasi kepada pengguna. Mengirim Pengingat untuk Menyelesaikan Pembayaran Untuk mengirim pengingat kepada pengguna yang belum menyelesaikan pembayaran, buatlah Mailable dan event serupa. Anda dapat menggunakan scheduler untuk memeriksa pesanan yang belum dibayar dan mengirimkan pengingat. Buat seeder atau command artisan untuk memeriksa pesanan yang belum dibayar: php artisan make:command SendPaymentReminder Di dalam command SendPaymentReminder.php, lakukan logika untuk memeriksa pesanan yang belum dibayar: namespace App\\\\Console\\\\Commands; use Illuminate\\\\Console\\\\Command; use App\\\\Models\\\\Order; use Illuminate\\\\Support\\\\Facades\\\\Mail; use App\\\\Mail\\\\PaymentReminder; class SendPaymentReminder extends Command { protected $signature = 'reminder:payment'; protected $description = 'Kirim pengingat pembayaran kepada pelanggan yang belum menyelesaikan pembayaran'; public function handle() { $orders = Order::where('status', 'pending')->get(); foreach ($orders as $order) { Mail::to($order->customer->email)->send(new PaymentReminder($order)); } $this->info('Pengingat pembayaran berhasil dikirim!'); } } Gunakan scheduler di file App\\\\Console\\\\Kernel.php untuk menjalankan perintah ini setiap hari atau sesuai kebutuhan: protected function schedule(Schedule $schedule) { $schedule->command('reminder:payment')->daily(); } Ini akan memastikan bahwa pengingat pembayaran dikirimkan secara otomatis kepada pelanggan yang belum menyelesaikan pembayaran setiap hari. Penutup dan saran dari mentor Laravel terus menjadi framework yang populer di kalangan developer berkat berbagai update menarik yang memudahkan pengembangan aplikasi web. Dengan fitur-fitur seperti autentikasi yang sederhana, integrasi payment gateway, hingga notifikasi otomatis, Laravel memudahkan developer untuk membangun aplikasi yang robust dan scalable. Kemudahan ini membuat Laravel tetap menjadi pilihan utama untuk banyak proyek pengembangan web. Untuk terus memperdalam pengetahuan Anda tentang Laravel dan teknologi lainnya, pantau terus website BuildWithAngga. Mereka sering memperbarui kelas gratis dengan studi kasus menarik yang dipandu oleh mentor berpengalaman. Selain itu, Anda juga bisa mendapatkan akses kelas seumur hidup, sehingga dapat belajar kapan saja sesuai kebutuhan. Jangan lewatkan kesempatan untuk mengembangkan skill Anda bersama BuildWithAngga dan jadilah developer yang handal!

Kelas Cara Bikin Admin dan Content Management System dengan Laravel Filament Projek Web Laundry di BuildWithAngga

Cara Bikin Admin dan Content Management System dengan Laravel Filament Projek Web Laundry

Saat kita membangun sebuah website untuk bisnis jasa laundry, tentu kita membutuhkan sebuah halaman admin dan content management system (CMS) yang memungkinkan kita untuk mengelola data seperti pesanan, pelanggan, layanan, hingga laporan keuangan. Pada artikel ini, kita akan membahas cara membuat halaman admin beserta CMS pada projek website jasa laundry menggunakan Laravel dan Filament, tanpa masuk ke detail coding. Laravel dan Filament: Kombinasi Tepat untuk Dashboard dan CMS Laravel dikenal sebagai framework PHP yang populer karena kemudahan penggunaannya, fitur-fitur yang lengkap, dan keamanannya. Laravel juga memiliki banyak package dan ekosistem yang bisa membantu developer membangun aplikasi web dengan cepat dan efisien. Salah satu paket yang sering digunakan untuk membuat dashboard dan CMS adalah Filament. Filament merupakan package untuk Laravel yang dirancang khusus untuk membangun interface admin yang modern, cepat, dan mudah dimaintenance. Dengan menggunakan Laravel dan Filament, kita bisa membuat dashboard dan CMS yang memiliki tampilan menarik, interaktif, dan fungsionalitas yang lengkap tanpa perlu banyak effort dalam coding. Mengapa Laravel dan Filament Cocok untuk Projek Web Laundry? Keamanan Terjamin: Dalam website jasa laundry, kita akan menangani banyak data pelanggan dan transaksi. Laravel dilengkapi dengan fitur keamanan yang sangat baik seperti CSRF protection, session management, dan lain-lain yang membantu melindungi data dari akses yang tidak sah.Pengelolaan Data yang Mudah: Filament menyediakan banyak fitur bawaan seperti CRUD generator, data table yang interaktif, dan form builder yang memudahkan kita dalam mengelola data. Misalnya, kita bisa dengan mudah membuat form untuk menambahkan layanan laundry baru, melihat daftar pesanan, atau mengelola pelanggan tanpa perlu menulis banyak kode.User Interface yang Modern dan Responsif: Dashboard admin yang dibuat menggunakan Filament memiliki tampilan yang modern dan user-friendly. Hal ini penting karena administrator yang mengelola sistem perlu menggunakan interface yang mudah dipahami dan navigasi yang intuitif.Cepat dan Efisien: Laravel dan Filament memanfaatkan komponen frontend seperti Alpine.js dan Tailwind CSS yang membuat loading halaman menjadi cepat dan performa aplikasi lebih optimal. Ini sangat membantu ketika kita ingin memantau pesanan dan laporan secara real-time tanpa ada lag.Mudah Dimaintenance: Salah satu kelebihan menggunakan Laravel adalah struktur kodenya yang bersih dan rapi. Dengan tambahan Filament, maintenance dashboard dan CMS menjadi lebih mudah karena kita bisa dengan cepat menambahkan fitur baru atau memperbarui fungsionalitas yang ada tanpa merusak sistem yang sudah berjalan. Analogi Sederhana Bayangkan Anda memiliki sebuah toko laundry. Laravel adalah bangunan toko yang kuat, aman, dan siap untuk ditempati. Di dalamnya, ada berbagai ruang untuk menyimpan data, melakukan proses, dan menerima pelanggan. Namun, untuk membuat toko tersebut lebih efektif, Anda membutuhkan rak yang terorganisir, meja kasir yang modern, dan sistem manajemen stok yang canggih. Di sinilah Filament berperan sebagai perabotan modern yang mengisi toko laundry Anda, menjadikan toko Anda tidak hanya kuat dan aman, tetapi juga nyaman untuk dikelola dan menarik bagi pelanggan. Dengan kombinasi Laravel dan Filament, Anda bisa fokus mengelola bisnis tanpa harus khawatir dengan kerumitan teknis yang biasanya terjadi pada sistem manajemen konten dan halaman admin. Tata Cara Membuat Projek Laravel Terbaru Menggunakan Composer dan Mengatur File .env untuk MySQL Membangun projek Laravel terbaru bisa dimulai dengan menggunakan command line sederhana. Laravel menyediakan berbagai cara untuk menginstall framework ini, tetapi cara yang paling umum dan disarankan adalah menggunakan Composer, dependency manager untuk PHP. Setelah instalasi, kita perlu mengatur file .env agar Laravel dapat terhubung dengan database MySQL. Berikut ini adalah penjelasan langkah-langkahnya beserta contoh kode lengkap. 1. Instalasi Laravel Menggunakan Composer Pastikan terlebih dahulu bahwa Composer sudah terinstall di komputer Anda. Jika belum, Anda bisa mengikuti panduan instalasi di Composer. Setelah Composer terinstall, buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat projek Laravel baru: composer create-project --prefer-dist laravel/laravel nama-projek-anda Perintah ini akan membuat sebuah folder projek baru dengan nama yang telah Anda tentukan (ganti nama-projek-anda dengan nama projek Anda). Laravel akan mengunduh semua file yang diperlukan dan mengatur struktur direktori projek secara otomatis. 2. Mengatur Koneksi Database di File .env Setelah projek Laravel berhasil dibuat, langkah selanjutnya adalah mengatur koneksi database. Laravel menggunakan file .env yang berada di root directory projek untuk menyimpan konfigurasi lingkungan, termasuk konfigurasi database. Buka file .env tersebut menggunakan text editor pilihan Anda, dan temukan bagian berikut: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=username_database DB_PASSWORD=password_database Ubah nilai-nilai pada variabel di atas sesuai dengan informasi koneksi MySQL yang Anda gunakan: DB_CONNECTION: Jenis koneksi database yang digunakan. Secara default, Laravel menggunakan mysql.DB_HOST: Alamat host database Anda, biasanya 127.0.0.1 atau localhost.DB_PORT: Port yang digunakan oleh MySQL, biasanya 3306.DB_DATABASE: Nama database yang akan digunakan oleh Laravel. Pastikan database ini sudah dibuat di MySQL.DB_USERNAME: Username untuk mengakses database.DB_PASSWORD: Password untuk mengakses database. Contoh konfigurasi lengkap: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=projek_laundry DB_USERNAME=root DB_PASSWORD= Dalam contoh ini, database yang digunakan bernama projek_laundry, dengan username root dan tanpa password. Pastikan untuk mengganti informasi ini sesuai dengan pengaturan MySQL Anda. 3. Membuat Database di MySQL Sebelum menjalankan projek Laravel, pastikan database yang disebutkan di file .env sudah ada. Anda bisa membuatnya menggunakan command line atau tools seperti phpMyAdmin. Jika menggunakan command line, jalankan perintah berikut di terminal MySQL: CREATE DATABASE projek_laundry; Ini akan membuat database kosong dengan nama projek_laundry yang akan digunakan oleh Laravel. 4. Menjalankan Projek Laravel Setelah konfigurasi database selesai, jalankan projek Laravel menggunakan perintah berikut di terminal: php artisan serve Perintah ini akan menjalankan server built-in Laravel di http://127.0.0.1:8000. Buka alamat tersebut di browser untuk melihat halaman default Laravel. 5. Menguji Koneksi Database Untuk memastikan bahwa koneksi database sudah benar, kita bisa menjalankan migrasi bawaan Laravel yang akan membuat beberapa tabel default di database. Jalankan perintah berikut di terminal: php artisan migrate Jika tidak ada error, berarti Laravel sudah berhasil terhubung ke database dan membuat tabel-tabel yang diperlukan. Tata Cara Membuat File Migration dan Model Beserta Fillable dan Relationship untuk Tabel Projek Kelas Dalam membangun aplikasi Laravel, kita sering membutuhkan beberapa tabel untuk menyimpan data. Untuk proyek seperti website jasa laundry, kita bisa membuat beberapa tabel seperti categories, laundry_services, cities, dan transactions. Setiap tabel memiliki hubungan (relationship) satu sama lain yang harus didefinisikan di dalam model. Berikut ini adalah langkah-langkah untuk membuat file migration dan model beserta fillable dan relationship untuk masing-masing tabel tersebut. 1. Membuat File Migration Untuk membuat file migration, kita bisa menggunakan perintah artisan make:migration. Berikut adalah contoh perintah untuk membuat file migration untuk setiap tabel: php artisan make:migration create_categories_table php artisan make:migration create_laundry_services_table php artisan make:migration create_cities_table php artisan make:migration create_transactions_table Setelah menjalankan perintah di atas, file migration akan dibuat di folder database/migrations. Setiap file tersebut berisi blueprint struktur tabel yang akan dibuat di database. Contoh kode untuk file migration create_categories_table: use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateCategoriesTable extends Migration { public function up() { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('categories'); } } Contoh kode untuk file migration create_laundry_services_table: use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateLaundryServicesTable extends Migration { public function up() { Schema::create('laundry_services', function (Blueprint $table) { $table->id(); $table->string('name'); $table->unsignedBigInteger('category_id'); $table->decimal('price', 8, 2); $table->timestamps(); $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('laundry_services'); } } Contoh kode untuk file migration create_cities_table: use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateCitiesTable extends Migration { public function up() { Schema::create('cities', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('cities'); } } Contoh kode untuk file migration create_transactions_table: use Illuminate\\\\Database\\\\Migrations\\\\Migration; use Illuminate\\\\Database\\\\Schema\\\\Blueprint; use Illuminate\\\\Support\\\\Facades\\\\Schema; class CreateTransactionsTable extends Migration { public function up() { Schema::create('transactions', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('laundry_service_id'); $table->unsignedBigInteger('city_id'); $table->integer('quantity'); $table->decimal('total_price', 10, 2); $table->timestamps(); $table->foreign('laundry_service_id')->references('id')->on('laundry_services')->onDelete('cascade'); $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('transactions'); } } 2. Membuat Model Beserta Fillable dan Relationship Setelah membuat file migration, langkah berikutnya adalah membuat model untuk setiap tabel yang sudah kita buat. Model digunakan untuk berinteraksi dengan tabel di database dan mendefinisikan relasi antar tabel. Contoh kode untuk model Category: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Category extends Model { use HasFactory; protected $fillable = [ 'name', ]; public function laundryServices() { return $this->hasMany(LaundryService::class); } } Pada model Category, terdapat relasi hasMany ke model LaundryService, yang berarti satu kategori dapat memiliki banyak layanan laundry. Contoh kode untuk model LaundryService: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class LaundryService extends Model { use HasFactory; protected $fillable = [ 'name', 'category_id', 'price', ]; public function category() { return $this->belongsTo(Category::class); } public function transactions() { return $this->hasMany(Transaction::class); } } Pada model LaundryService, terdapat relasi belongsTo ke model Category dan hasMany ke model Transaction. Contoh kode untuk model City: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class City extends Model { use HasFactory; protected $fillable = [ 'name', ]; public function transactions() { return $this->hasMany(Transaction::class); } } Pada model City, terdapat relasi hasMany ke model Transaction. Contoh kode untuk model Transaction: namespace App\\\\Models; use Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory; use Illuminate\\\\Database\\\\Eloquent\\\\Model; class Transaction extends Model { use HasFactory; protected $fillable = [ 'laundry_service_id', 'city_id', 'quantity', 'total_price', ]; public function laundryService() { return $this->belongsTo(LaundryService::class); } public function city() { return $this->belongsTo(City::class); } } Pada model Transaction, terdapat relasi belongsTo ke model LaundryService dan belongsTo ke model City. Relasi ini menunjukkan bahwa setiap transaksi hanya dapat memiliki satu layanan laundry dan satu kota. Dengan mengikuti langkah-langkah di atas, Anda telah berhasil membuat file migration dan model beserta fillable dan relationship untuk tabel categories, laundry_services, cities, dan transactions. Anda dapat melanjutkan dengan menjalankan perintah php artisan migrate untuk membuat tabel-tabel ini di database Anda. Tata Cara Menginstall Package Filament dan Membuat Akun Admin Filament adalah package Laravel yang memudahkan pembuatan dashboard admin dengan fitur CRUD yang interaktif dan user-friendly. Untuk menginstall package Filament dan membuat akun admin, berikut ini adalah langkah-langkahnya beserta contoh koding lengkap. Menginstall Package Filament Pastikan projek Laravel Anda sudah siap dan Composer telah terinstall di sistem Anda. Buka terminal di direktori projek Laravel Anda dan jalankan perintah berikut untuk menginstall Filament: composer require filament/filament Perintah ini akan mengunduh dan menginstall package Filament beserta dependensinya ke dalam projek Laravel Anda. Setelah instalasi selesai, jalankan perintah berikut untuk mengatur Filament dan membuat beberapa file konfigurasi dasar yang diperlukan: php artisan filament:install Perintah ini akan melakukan beberapa hal, seperti menambahkan route dan file konfigurasi Filament, serta mempersiapkan projek Laravel Anda untuk menggunakan package ini. Menambahkan Middleware Filament Pastikan middleware Filament sudah terdaftar dalam file app/Http/Kernel.php di bagian $middlewareGroups. Ini memastikan bahwa route admin hanya bisa diakses oleh pengguna yang sudah terautentikasi. protected $middlewareGroups = [ 'web' => [ // Middleware default Laravel ], 'filament' => [ \\\\Filament\\\\Http\\\\Middleware\\\\Authenticate::class, \\\\Filament\\\\Http\\\\Middleware\\\\DispatchServingFilamentEvent::class, \\\\Filament\\\\Http\\\\Middleware\\\\ShareFilamentData::class, ], ]; Jika middleware ini belum ada, tambahkan ke dalam array filament seperti pada contoh di atas. Membuat Akun Admin Setelah Filament terinstall, langkah berikutnya adalah membuat akun admin yang dapat digunakan untuk login ke dashboard Filament. Jalankan perintah berikut untuk membuat user admin baru: php artisan make:filament-user Anda akan diminta untuk mengisi informasi user seperti nama, email, dan password. Contoh output perintah di terminal: Name: Admin Email: [email protected] Password: ******** Setelah proses ini selesai, user admin baru akan dibuat dan dapat digunakan untuk login ke dashboard admin Filament. Mengakses Dashboard Admin Untuk mengakses dashboard admin Filament, buka browser dan pergi ke URL berikut: <http://localhost:8000/admin> Gantilah localhost:8000 dengan URL projek Laravel Anda jika berbeda. Gunakan email dan password yang telah dibuat pada langkah sebelumnya untuk login. Menyesuaikan Configurasi Filament Anda dapat mengatur beberapa konfigurasi tambahan untuk Filament, seperti nama aplikasi, URL login, dan sebagainya, di file config/filament.php. Contoh konfigurasi dasar: return [ 'brand' => 'Laundry Admin', 'path' => 'admin', 'auth' => [ 'guard' => 'web', ], 'resources' => [ // Daftar resource yang terdaftar ], ]; Konfigurasi ini memungkinkan Anda untuk mengatur beberapa aspek visual dan fungsional dari dashboard admin Filament. Dengan mengikuti langkah-langkah di atas, Anda telah berhasil menginstall package Filament dan membuat akun admin untuk mengakses dashboard admin. Anda bisa mulai menambahkan resource dan fitur lainnya ke dalam dashboard sesuai kebutuhan aplikasi Anda. Tata Cara Membuat Resource untuk CRUD Seluruh Tabel dengan Filament Setelah menginstall package Filament dan membuat akun admin, langkah berikutnya adalah membuat resource untuk CRUD (Create, Read, Update, Delete) pada tabel-tabel yang sudah ada, seperti categories, laundry_services, cities, dan transactions. Resource ini akan membantu mengatur dan menampilkan data dari tabel-tabel tersebut di dashboard admin Filament. Berikut adalah langkah-langkah beserta contoh koding lengkap untuk membuat resource CRUD tersebut. Membuat Resource CRUD untuk Tabel Categories Jalankan perintah berikut di terminal untuk membuat resource Filament untuk tabel categories: php artisan make:filament-resource Category Perintah ini akan membuat beberapa file resource yang berada di direktori app/Filament/Resources/CategoryResource. Berikut adalah contoh kode lengkap untuk file CategoryResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CategoryResource\\\\Pages; use App\\\\Models\\\\Category; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Tables; use Filament\\\\Forms; class CategoryResource extends Resource { protected static ?string $model = Category::class; protected static ?string $navigationIcon = 'heroicon-o-collection'; protected static ?string $navigationGroup = 'Laundry Management'; public static function form(Form $form): Form { return $form->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), ]); } public static function table(Table $table): Table { return $table->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ])->filters([ // ])->actions([ Tables\\\\Actions\\\\EditAction::make(), ])->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ManageCategories::route('/'), ]; } } File ini mengatur form dan tabel untuk resource Category. Bagian form menentukan schema form input yang digunakan untuk menambah dan mengedit data, sedangkan bagian table mengatur kolom apa saja yang akan ditampilkan di tabel, serta actions dan bulk actions yang tersedia. Membuat Resource CRUD untuk Tabel LaundryServices Jalankan perintah berikut untuk membuat resource Filament untuk tabel laundry_services: php artisan make:filament-resource LaundryService Berikut adalah contoh kode lengkap untuk file LaundryServiceResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\LaundryServiceResource\\\\Pages; use App\\\\Models\\\\LaundryService; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Tables; use Filament\\\\Forms; class LaundryServiceResource extends Resource { protected static ?string $model = LaundryService::class; protected static ?string $navigationIcon = 'heroicon-o-collection'; protected static ?string $navigationGroup = 'Laundry Management'; public static function form(Form $form): Form { return $form->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), Forms\\\\Components\\\\Select::make('category_id') ->relationship('category', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('price') ->required() ->numeric(), ]); } public static function table(Table $table): Table { return $table->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('category.name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ])->filters([ // ])->actions([ Tables\\\\Actions\\\\EditAction::make(), ])->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ManageLaundryServices::route('/'), ]; } } Bagian form pada resource ini memiliki input untuk name, category_id (yang menggunakan relationship), dan price. Pada bagian table, kolom category.name digunakan untuk menampilkan nama kategori layanan laundry. Membuat Resource CRUD untuk Tabel Cities Untuk membuat resource Filament pada tabel cities, jalankan perintah berikut: php artisan make:filament-resource City Berikut adalah contoh kode lengkap untuk file CityResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\CityResource\\\\Pages; use App\\\\Models\\\\City; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Tables; use Filament\\\\Forms; class CityResource extends Resource { protected static ?string $model = City::class; protected static ?string $navigationIcon = 'heroicon-o-collection'; protected static ?string $navigationGroup = 'Location Management'; public static function form(Form $form): Form { return $form->schema([ Forms\\\\Components\\\\TextInput::make('name') ->required() ->maxLength(255), ]); } public static function table(Table $table): Table { return $table->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ])->filters([ // ])->actions([ Tables\\\\Actions\\\\EditAction::make(), ])->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ManageCities::route('/'), ]; } } Resource ini hanya memiliki satu input name di dalam form schema, karena tabel cities hanya menyimpan nama kota. Membuat Resource CRUD untuk Tabel Transactions Jalankan perintah berikut untuk membuat resource Filament untuk tabel transactions: php artisan make:filament-resource Transaction Berikut adalah contoh kode lengkap untuk file TransactionResource.php: namespace App\\\\Filament\\\\Resources; use App\\\\Filament\\\\Resources\\\\TransactionResource\\\\Pages; use App\\\\Models\\\\Transaction; use Filament\\\\Resources\\\\Resource; use Filament\\\\Resources\\\\Table; use Filament\\\\Resources\\\\Form; use Filament\\\\Tables; use Filament\\\\Forms; class TransactionResource extends Resource { protected static ?string $model = Transaction::class; protected static ?string $navigationIcon = 'heroicon-o-collection'; protected static ?string $navigationGroup = 'Order Management'; public static function form(Form $form): Form { return $form->schema([ Forms\\\\Components\\\\Select::make('laundry_service_id') ->relationship('laundryService', 'name') ->required(), Forms\\\\Components\\\\Select::make('city_id') ->relationship('city', 'name') ->required(), Forms\\\\Components\\\\TextInput::make('quantity') ->required() ->numeric(), Forms\\\\Components\\\\TextInput::make('total_price') ->required() ->numeric(), ]); } public static function table(Table $table): Table { return $table->columns([ Tables\\\\Columns\\\\TextColumn::make('id')->sortable(), Tables\\\\Columns\\\\TextColumn::make('laundryService.name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('city.name')->sortable()->searchable(), Tables\\\\Columns\\\\TextColumn::make('quantity')->sortable(), Tables\\\\Columns\\\\TextColumn::make('total_price')->sortable(), Tables\\\\Columns\\\\TextColumn::make('created_at')->dateTime(), ])->filters([ // ])->actions([ Tables\\\\Actions\\\\EditAction::make(), ])->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } public static function getPages(): array { return [ 'index' => Pages\\\\ManageTransactions::route('/'), ]; } } Resource ini mengatur form schema dengan input laundry_service_id dan city_id yang menggunakan relationship, serta quantity dan total_price. Pada bagian table, nama layanan laundry dan kota ditampilkan melalui relasi. Dengan mengikuti langkah-langkah di atas, resource CRUD untuk setiap tabel telah berhasil dibuat. Resource ini memungkinkan kita untuk mengelola data dari tabel categories, laundry_services, cities, dan transactions langsung dari dashboard admin Filament. Anda bisa menyesuaikan resource ini sesuai dengan kebutuhan projek Anda. Penutup dan Kesimpulan Dengan menggunakan Laravel dan Filament, kita dapat membangun sistem manajemen konten yang kuat dan fleksibel untuk berbagai jenis aplikasi, termasuk website jasa laundry. Filament memungkinkan pembuatan dashboard admin yang interaktif dengan fitur CRUD yang lengkap dan mudah digunakan tanpa harus menulis banyak kode dari awal. Dalam artikel ini, kita telah membahas langkah-langkah untuk menginstall Filament, membuat akun admin, serta membuat resource CRUD untuk tabel categories, laundry_services, cities, dan transactions. Menggunakan kombinasi Laravel dan Filament memberikan banyak keuntungan, seperti kemudahan dalam pengelolaan data, tampilan antarmuka yang modern, serta keamanan yang baik. Proses ini tidak hanya mempercepat pembangunan aplikasi, tetapi juga memudahkan maintenance dan pengembangan lebih lanjut. Laravel terus berkembang dan menjadi pilihan utama bagi banyak developer karena berbagai pembaruan menarik yang selalu memudahkan proses pengembangan aplikasi. Dengan komunitas yang aktif dan dokumentasi yang lengkap, framework ini menawarkan solusi yang efisien dan efektif untuk membangun aplikasi web yang aman, cepat, dan scalable. Jika Anda ingin terus mengikuti perkembangan terbaru Laravel dan belajar dari studi kasus nyata, pantau terus website BuildWithAngga. Mereka secara rutin mengupdate kelas-kelas gratis yang dilengkapi dengan studi kasus menarik, dipandu oleh mentor berpengalaman. Selain itu, Anda akan mendapatkan akses seumur hidup untuk setiap kelas yang diikuti, memungkinkan Anda untuk belajar kapan saja dan di mana saja. Jangan lewatkan kesempatan untuk terus mengasah kemampuan Anda bersama komunitas yang solid dan sumber belajar yang berkualitas. Selamat belajar dan tetap semangat dalam mengembangkan proyek Anda!

Kelas Tutorial Latihan Array Golang Pada Projek Website Jual Mobil di BuildWithAngga

Tutorial Latihan Array Golang Pada Projek Website Jual Mobil

Dalam dunia web development, salah satu aspek yang sering menjadi perhatian adalah performa aplikasi. Untuk memastikan website yang kita bangun berjalan dengan lancar, penting bagi kita untuk memahami berbagai teknik optimisasi. Salah satunya adalah dengan mempelajari tipe data array pada Golang. Meskipun Golang sering digunakan untuk backend programming, memahami cara kerja array di Golang dapat membantu kita meningkatkan performa aplikasi Laravel, terutama dalam pengolahan data yang kompleks. Pentingnya Tipe Data Array dalam Web Development Bayangkan kita sedang membangun sebuah website jual beli mobil dengan Laravel. Di website ini, kita memiliki data mobil yang sangat banyak, mulai dari jenis mobil, harga, hingga detail spesifikasi lainnya. Untuk menyimpan dan mengelola data-data ini dengan efisien, kita bisa menggunakan tipe data array pada Golang. Array memungkinkan kita untuk menyimpan banyak data dalam satu variabel dengan tipe yang sama. Ini sangat penting karena dapat mengurangi beban memory dan mempercepat proses pengolahan data. Analogi Sederhana: Bayangkan kita memiliki banyak kotak penyimpanan (array), di mana setiap kotak hanya bisa menyimpan barang dengan tipe yang sama, misalnya hanya buku. Jadi, jika kita ingin menyimpan buku, kita bisa memasukkan semua buku ke dalam satu kotak (array) ini, tanpa perlu membuat banyak variabel berbeda untuk setiap buku. Hal ini tentu lebih efisien dan mudah dikelola. Contoh Penggunaan Tipe Data Array dalam Proyek Website Jual Mobil Online Untuk membangun website jual mobil online, kita sering kali perlu mengelola berbagai macam data seperti daftar mobil, detail spesifikasi, hingga data pelanggan. Tipe data array di Golang sangat berguna untuk menyimpan dan mengelola data-data tersebut dengan efisien. Berikut ini beberapa contoh sederhana hingga kompleks penggunaan array dalam konteks proyek ini. Daftar Mobil Tersedia Misalkan kita memiliki daftar mobil yang tersedia di website. Kita bisa menggunakan array untuk menyimpan nama-nama mobil tersebut. var daftarMobil = [5]string{"Toyota Camry", "Honda Civic", "Ford Mustang", "BMW X5", "Mercedes-Benz C-Class"} Array di atas menyimpan lima jenis mobil yang tersedia di website. Dengan array ini, kita bisa dengan mudah menampilkan daftar mobil di halaman utama. Harga Mobil Untuk menyimpan harga masing-masing mobil, kita bisa menggunakan array yang menyimpan nilai integer. var hargaMobil = [5]int{350000000, 250000000, 500000000, 750000000, 900000000} Harga dari setiap mobil tersimpan dalam urutan yang sama dengan array daftarMobil. Ini memudahkan kita untuk mencocokkan harga dengan mobil yang bersangkutan. Menyimpan Status Ketersediaan Untuk mengetahui apakah mobil tersedia atau tidak, kita bisa menggunakan array boolean. var statusTersedia = [5]bool{true, false, true, true, false} Array ini menunjukkan bahwa mobil pertama, ketiga, dan keempat tersedia, sedangkan mobil kedua dan kelima tidak tersedia. Menyimpan Detail Spesifikasi Jika kita ingin menyimpan detail spesifikasi dari setiap mobil, kita bisa menggunakan array dua dimensi. var spesifikasiMobil = [5][3]string{ {"2000 cc", "Automatic", "Sedan"}, {"1500 cc", "Manual", "Hatchback"}, {"5000 cc", "Automatic", "Coupe"}, {"3000 cc", "Automatic", "SUV"}, {"2500 cc", "Manual", "Sedan"}, } Setiap mobil memiliki tiga detail spesifikasi yang berbeda seperti kapasitas mesin, jenis transmisi, dan tipe bodi. Mengelola Data Pelanggan Untuk menyimpan nama-nama pelanggan yang telah membeli mobil, kita bisa menggunakan array string. var pelanggan = [3]string{"Andi", "Budi", "Citra"} Array ini menyimpan nama pelanggan yang melakukan pembelian. Menghitung Total Penjualan Jika kita ingin menghitung total penjualan dari setiap mobil, kita bisa menggunakan array integer. var penjualan = [5]int{3, 0, 5, 2, 1} Nilai dalam array ini menunjukkan jumlah unit terjual dari masing-masing mobil. Menggabungkan Nama Mobil dan Harganya Kita bisa membuat array yang menyimpan gabungan nama mobil dan harganya dalam format string. var mobilDenganHarga = [5]string{ "Toyota Camry - 350 Juta", "Honda Civic - 250 Juta", "Ford Mustang - 500 Juta", "BMW X5 - 750 Juta", "Mercedes-Benz C-Class - 900 Juta", } Dengan array ini, kita bisa menampilkan informasi mobil beserta harganya secara langsung. Memfilter Mobil yang Tersedia Untuk mencari mobil yang tersedia, kita bisa menggunakan loop pada array status ketersediaan. for i, tersedia := range statusTersedia { if tersedia { fmt.Println(daftarMobil[i]) } } Kode ini akan menampilkan hanya mobil-mobil yang statusnya tersedia. Menampilkan Spesifikasi Berdasarkan Nama Mobil Jika kita ingin menampilkan spesifikasi berdasarkan input nama mobil, kita bisa menggunakan fungsi sederhana. func tampilkanSpesifikasi(namaMobil string) { for i, mobil := range daftarMobil { if mobil == namaMobil { fmt.Println("Spesifikasi:", spesifikasiMobil[i]) } } } tampilkanSpesifikasi("BMW X5") Kode ini akan menampilkan spesifikasi dari mobil yang namanya cocok dengan input yang diberikan. Mengelola Keranjang Pembelian Untuk menyimpan daftar mobil yang dipilih oleh pelanggan sebelum melakukan pembelian, kita bisa menggunakan array dinamis. var keranjangPembelian []string func tambahKeKeranjang(namaMobil string) { keranjangPembelian = append(keranjangPembelian, namaMobil) } tambahKeKeranjang("Toyota Camry") tambahKeKeranjang("Ford Mustang") fmt.Println("Keranjang Pembelian:", keranjangPembelian) Array keranjangPembelian menyimpan mobil-mobil yang dipilih pelanggan sebelum mereka melakukan checkout. Penjelasan lengkap contoh koding var spesifikasiMobil = [5][3]string{ {"2000 cc", "Automatic", "Sedan"}, {"1500 cc", "Manual", "Hatchback"}, {"5000 cc", "Automatic", "Coupe"}, {"3000 cc", "Automatic", "SUV"}, {"2500 cc", "Manual", "Sedan"}, } 1. var spesifikasiMobil = [5][3]string var: Kata kunci ini digunakan untuk mendeklarasikan variabel baru di Golang.spesifikasiMobil: Nama variabel yang kita gunakan untuk menyimpan data array. Nama ini dipilih agar mudah dimengerti bahwa variabel ini menyimpan data spesifikasi mobil.[5][3]: Ini adalah deklarasi ukuran dari array dua dimensi.5: Angka pertama menunjukkan jumlah baris dalam array, yang berarti ada 5 jenis mobil yang spesifikasinya akan disimpan.3: Angka kedua menunjukkan jumlah kolom dalam array, yang berarti ada 3 spesifikasi untuk setiap mobil yang akan disimpan.string: Tipe data dari setiap elemen dalam array. Dalam kasus ini, setiap elemen adalah string yang merepresentasikan informasi spesifikasi mobil. 2. Mengisi Nilai Array Nilai array diisi menggunakan format {} untuk setiap baris dan elemen-elemen string di dalamnya dipisahkan dengan koma ,. Setiap baris merepresentasikan spesifikasi dari satu jenis mobil. Baris 1: {"2000 cc", "Automatic", "Sedan"} "2000 cc": Kapasitas mesin mobil, dalam hal ini 2000 cc."Automatic": Jenis transmisi mobil, yaitu automatic."Sedan": Jenis bodi mobil, yaitu sedan. Baris 2: {"1500 cc", "Manual", "Hatchback"} "1500 cc": Kapasitas mesin mobil, dalam hal ini 1500 cc."Manual": Jenis transmisi mobil, yaitu manual."Hatchback": Jenis bodi mobil, yaitu hatchback. Baris 3: {"5000 cc", "Automatic", "Coupe"} "5000 cc": Kapasitas mesin mobil, dalam hal ini 5000 cc, yang merupakan kapasitas besar untuk mobil sport."Automatic": Jenis transmisi mobil, yaitu automatic."Coupe": Jenis bodi mobil, yaitu coupe, yang biasanya mobil sport atau mewah dengan dua pintu. Baris 4: {"3000 cc", "Automatic", "SUV"} "3000 cc": Kapasitas mesin mobil, dalam hal ini 3000 cc, yang umum untuk mobil jenis SUV."Automatic": Jenis transmisi mobil, yaitu automatic."SUV": Jenis bodi mobil, yaitu SUV (Sport Utility Vehicle), mobil dengan bodi besar dan ground clearance tinggi. Baris 5: {"2500 cc", "Manual", "Sedan"} "2500 cc": Kapasitas mesin mobil, dalam hal ini 2500 cc."Manual": Jenis transmisi mobil, yaitu manual."Sedan": Jenis bodi mobil, yaitu sedan. Penggunaan Array Dua Dimensi Array dua dimensi ini sangat berguna untuk menyimpan data yang memiliki hubungan antara satu baris dengan yang lainnya. Setiap baris menyimpan data dari satu mobil, sedangkan setiap kolom menyimpan tipe spesifikasinya seperti kapasitas mesin, jenis transmisi, dan jenis bodi mobil. Cara Mengakses Data dari Array Dua Dimensi Misalnya, jika kita ingin mengakses spesifikasi transmisi dari mobil ketiga, kita bisa melakukannya seperti ini: fmt.Println(spesifikasiMobil[2][1]) Output: Automatic Penjelasan: spesifikasiMobil[2]: Mengakses baris ketiga dalam array, yaitu spesifikasi mobil ketiga.spesifikasiMobil[2][1]: Mengakses kolom kedua dari baris ketiga, yang berisi informasi jenis transmisi dari mobil ketiga, yaitu "Automatic". Kapan Harus Menggunakan Array atau Slice di Golang Pemilihan antara array atau slice di Golang sangat penting tergantung pada kebutuhan spesifik dalam proyek. Array dan slice adalah struktur data dasar yang digunakan untuk menyimpan koleksi data dengan tipe yang sama. Namun, ada beberapa perbedaan utama yang menentukan kapan kita harus menggunakan salah satu dari mereka. Berikut adalah tiga alasan utama untuk memilih menggunakan array atau slice dalam pengembangan aplikasi. Ukuran Data yang Tetap Array cocok digunakan ketika kita tahu pasti jumlah elemen yang akan disimpan dan jumlah tersebut tidak akan berubah selama masa eksekusi program. Array memiliki ukuran tetap yang ditentukan saat deklarasi, sehingga efisiensi penggunaan memori dapat lebih terjaga. Misalnya, jika kita sedang membangun fitur di website jual mobil untuk menampilkan jumlah kursi dari berbagai jenis mobil yang hanya memiliki 5 opsi tetap, kita bisa menggunakan array. var jumlahKursi = [5]int{2, 4, 5, 7, 8} // Mengakses jumlah kursi dari mobil ke-3 fmt.Println(jumlahKursi[2]) // Output: 5 Pada contoh di atas, kita tahu bahwa hanya ada 5 jenis jumlah kursi yang mungkin, sehingga array dengan panjang tetap sesuai untuk menyimpan data ini. Data yang Dinamis dan Bertambah Slice lebih fleksibel dibandingkan array karena ukurannya dapat berubah selama runtime. Jika kita tidak tahu pasti berapa banyak elemen yang akan ditambahkan atau kita perlu menambah dan menghapus elemen secara dinamis, maka slice adalah pilihan yang lebih tepat. Misalnya, jika kita ingin menambahkan berbagai jenis mobil baru ke dalam daftar secara dinamis berdasarkan input dari user. var daftarMobil []string daftarMobil = append(daftarMobil, "Toyota Camry") daftarMobil = append(daftarMobil, "Honda Civic", "BMW X5") // Menampilkan seluruh daftar mobil fmt.Println(daftarMobil) // Output: [Toyota Camry Honda Civic BMW X5] Pada contoh ini, slice daftarMobil dapat dengan mudah diubah ukurannya dengan menambahkan elemen-elemen baru menggunakan fungsi append(). Manipulasi Data yang Kompleks Slice menyediakan banyak fungsi dan metode built-in yang memudahkan manipulasi data, seperti menambah, menghapus, atau mengiris sebagian data. Jika kita memerlukan berbagai operasi kompleks pada data yang kita simpan, slice sangat direkomendasikan. Misalnya, jika kita ingin mengambil hanya 3 mobil pertama dari daftar mobil yang tersedia. daftarMobil := []string{"Toyota Camry", "Honda Civic", "Ford Mustang", "BMW X5", "Mercedes-Benz C-Class"} // Mengambil tiga mobil pertama mobilFavorit := daftarMobil[:3] fmt.Println(mobilFavorit) // Output: [Toyota Camry Honda Civic Ford Mustang] Dengan slice, kita bisa menggunakan teknik slicing [:3] untuk mengambil sebagian data dari slice utama daftarMobil dengan sangat mudah. Array lebih cocok digunakan ketika ukuran data sudah pasti dan tidak berubah, sedangkan slice lebih fleksibel dan direkomendasikan untuk data yang dinamis serta memerlukan manipulasi lebih lanjut. Memahami kapan menggunakan array atau slice dapat membantu kita dalam menulis kode yang lebih efisien dan sesuai dengan kebutuhan aplikasi yang sedang dibangun. Penutup Menguasai Golang merupakan langkah penting bagi seorang developer yang ingin berkembang di dunia web development modern. Golang dikenal dengan performanya yang tinggi, efisiensi penggunaan memori, serta dukungan untuk concurrency yang sangat baik. Kemampuan ini menjadikan Golang pilihan utama bagi banyak perusahaan besar untuk membangun aplikasi backend yang skalabel dan cepat. Dengan terus belajar dan mengasah kemampuan Golang, peluang karier di industri teknologi akan semakin terbuka lebar. Developer Golang sangat dicari oleh perusahaan yang membutuhkan aplikasi dengan performa tinggi, seperti platform e-commerce, sistem pembayaran, hingga layanan cloud. Dengan keahlian ini, kamu dapat mengisi berbagai posisi strategis seperti backend developer, DevOps engineer, hingga software architect. Agar pembelajaran menjadi lebih terarah, kamu dapat belajar di BuildWithAngga.com. Platform ini menawarkan berbagai kursus berkualitas dengan beberapa benefit utama, seperti: Akses Selamanya: Kamu dapat belajar kapan saja tanpa batasan waktu, sehingga proses pembelajaran menjadi lebih fleksibel.Portfolio Berkualitas Baik: Setiap kelas disusun untuk membantu kamu menghasilkan portfolio yang menarik dan profesional, sesuai dengan standar industri.Bimbingan Mentor Expert: Kamu bisa berdiskusi langsung dengan mentor berpengalaman yang siap membantu menjawab pertanyaan dan memberikan arahan dalam proses pembelajaran. Dengan dukungan penuh dari BuildWithAngga, kamu dapat belajar Golang dengan lebih efektif dan siap bersaing di industri teknologi yang terus berkembang. Jadi, jangan ragu untuk terus belajar dan kembangkan potensimu bersama BuildWithAngga!

Kelas Tutorial Optimize Laravel 11 Pada Projek Website Langganan Katering di BuildWithAngga

Tutorial Optimize Laravel 11 Pada Projek Website Langganan Katering

Saat kita membangun website langganan katering, penting untuk memahami bahwa pengalaman pengguna atau user experience adalah kunci utama. Tidak hanya soal tampilan yang menarik, tetapi juga performa, kecepatan, dan keamanan. Sebuah website yang lambat atau sering bermasalah bisa membuat calon customer beralih ke kompetitor. Pentingnya User Experience pada Website Katering Analoginya seperti restoran. Bayangkan kita datang ke sebuah restoran yang terlihat menarik dari luar, tapi saat masuk, pelayanannya lambat, makanan tidak sesuai harapan, dan tempatnya kotor. Meski rasa makanannya enak, pengalaman yang buruk tersebut bisa membuat kita enggan kembali. Begitu juga dengan website katering. Website yang lambat atau tidak aman dapat membuat calon pelanggan merasa tidak nyaman, meskipun produk yang ditawarkan bagus. Dalam dunia web development, kita perlu memastikan bahwa website kita tidak hanya berfungsi dengan baik, tetapi juga memberikan pengalaman yang menyenangkan bagi pengguna. Inilah sebabnya mengapa optimasi sangat penting dalam setiap aspek website kita, terutama pada projek yang menggunakan Laravel. Mengapa CRUD Saja Tidak Cukup? Banyak developer yang berfokus pada fitur CRUD (Create, Read, Update, Delete) saja saat membangun aplikasi Laravel. Meskipun ini adalah dasar dari hampir semua aplikasi web, ada beberapa hal penting lainnya yang perlu diperhatikan untuk membuat website kita lebih optimal, aman, dan cepat. Berikut beberapa optimasi yang bisa kita terapkan: Caching: Menggunakan cache dapat mempercepat akses data yang sering di-request oleh user. Laravel memiliki dukungan untuk berbagai jenis cache, seperti file cache, database cache, dan memcached. Dengan caching, kita bisa mengurangi waktu pemrosesan data yang sama berulang kali.Optimasi Query Database: Query yang tidak optimal dapat memperlambat performa website. Gunakan Eloquent ORM dengan bijak dan pastikan untuk memanfaatkan eager loading untuk mengurangi jumlah query yang dieksekusi. Misalnya, daripada menggunakan foreach untuk mengambil data relasi satu per satu, gunakan with() untuk mengambil semua data yang dibutuhkan dalam satu query.Optimasi Autoload: Laravel menggunakan Composer untuk autoloading. Pastikan kita mengoptimalkan autoload class dengan perintah composer dump-autoload -o. Ini akan mengurangi waktu yang dibutuhkan untuk memuat class yang dibutuhkan dalam aplikasi.Mengurangi Ukuran Response: Kita bisa menggunakan teknik kompresi seperti gzip untuk mengurangi ukuran response yang dikirimkan ke browser user. Ini akan mempercepat waktu loading halaman. Selain itu, pastikan kita hanya mengirimkan data yang dibutuhkan oleh user.Keamanan: Gunakan fitur keamanan Laravel seperti CSRF protection, XSS protection, dan validasi input untuk melindungi data user. Keamanan yang baik akan membuat user lebih percaya untuk menggunakan layanan kita.Optimasi Gambar: Gambar yang terlalu besar bisa memperlambat loading halaman. Gunakan gambar dengan resolusi yang tepat dan kompresi yang baik. Kita bisa menggunakan library seperti Intervention Image untuk memanipulasi gambar sebelum disimpan ke server.Monitoring dan Profiling: Gunakan tool seperti Laravel Telescope untuk memantau kinerja aplikasi secara real-time. Kita bisa melihat query yang lambat, request yang memakan waktu lama, dan berbagai hal lain yang bisa dioptimasi. Contoh Implementasi Optimasi Sederhana Misalkan kita memiliki fitur untuk menampilkan daftar menu katering di website. Tanpa optimasi, query yang dieksekusi mungkin memanggil data menu, kategori, dan gambar satu per satu. Ini bisa menyebabkan banyak query yang tidak efisien. Untuk mengoptimalkannya, kita bisa menggunakan eager loading seperti ini: $menus = Menu::with(['category', 'images'])->get(); Dengan menggunakan with(), Laravel hanya akan menjalankan satu query untuk menu, kategori, dan gambar, sehingga performa lebih cepat. Mengapa Laravel Pilihan Tepat untuk Website Langganan Katering? Laravel adalah salah satu framework PHP yang paling populer dan sangat cocok untuk membangun website langganan katering. Mengapa? Karena Laravel memiliki banyak fitur bawaan yang memudahkan developer dalam mengembangkan aplikasi web yang kompleks, termasuk CRUD, autentikasi, manajemen sesi, hingga integrasi API. Selain itu, Laravel sangat fleksibel sehingga bisa ditingkatkan performanya jika kita paham cara melakukan optimasi dengan benar. Dengan Laravel, kita dapat membangun sistem pemesanan dan manajemen langganan yang cepat, aman, dan scalable. Ketika proyek berkembang, Laravel juga menyediakan berbagai tools dan library untuk meningkatkan performa aplikasi tanpa perlu membangun ulang dari awal. Hal-hal yang Perlu Dioptimalkan dalam Proyek Langganan Katering Menggunakan Laravel 11 Penggunaan Redis untuk Cache dan Queue Redis adalah pilihan yang baik untuk mengelola cache dan queue dalam aplikasi Laravel. Dengan memanfaatkan Redis, kita bisa menyimpan data yang sering diakses di dalam memori, sehingga mengurangi beban pada database. Misalnya, untuk menyimpan data user yang sering login, kita bisa menambahkan konfigurasi Redis pada .env: CACHE_DRIVER=redis QUEUE_CONNECTION=redis Kemudian gunakan Redis pada middleware atau logic tertentu: $user = Cache::remember('user:' . $userId, 600, function() use ($userId) { return User::find($userId); }); Mengoptimalkan Query dengan Indexing Pastikan kolom-kolom yang sering digunakan dalam kondisi where atau join memiliki index pada database. Ini akan meningkatkan kecepatan query secara signifikan. Misalnya, jika kita sering mencari data menu berdasarkan category_id, tambahkan index seperti berikut: Schema::table('menus', function (Blueprint $table) { $table->index('category_id'); }); Menggunakan Kompresi HTTP untuk Response Kompresi HTTP seperti gzip dapat mengurangi ukuran response yang dikirimkan ke browser user, sehingga mempercepat waktu loading halaman. Kita dapat mengaktifkan gzip pada server atau menggunakan middleware di Laravel: public function handle($request, Closure $next) { $response = $next($request); $response->header('Content-Encoding', 'gzip'); return $response; } Penerapan Lazy Loading untuk Mengurangi Beban Database Ketika menggunakan Eloquent, hindari lazy loading yang berlebihan. Misalnya, saat menampilkan daftar menu bersama kategori dan gambar, gunakan eager loading untuk mengurangi jumlah query: $menus = Menu::with(['category', 'images'])->get(); Dengan cara ini, kita hanya melakukan satu query untuk mengambil semua data yang diperlukan. Manajemen Session dengan Database atau Redis Untuk proyek besar seperti langganan katering, kita perlu mengelola session dengan lebih efisien. Laravel mendukung session dengan berbagai driver seperti Redis atau database. Ini bisa membantu mengurangi beban pada file system: SESSION_DRIVER=redis Optimasi Penggunaan Storage dengan CDN Jika kita menyimpan banyak gambar menu atau dokumentasi lainnya, lebih baik menggunakan layanan CDN seperti Cloudflare atau AWS S3 untuk menyimpan file tersebut. Kita bisa mengatur storage di Laravel agar terhubung ke CDN: FILESYSTEM_DRIVER=s3 Dan konfigurasi filesystems.php untuk S3: 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), ], Penggunaan Model Binding untuk Keamanan dan Efisiensi Manfaatkan route model binding untuk mengurangi query manual dan meningkatkan keamanan. Dengan menggunakan model binding, kita bisa memastikan bahwa hanya data yang benar-benar ada yang akan diproses: Route::get('menu/{menu}', function (Menu $menu) { return view('menu.show', compact('menu')); }); Ini akan secara otomatis mencari menu berdasarkan id dan melemparkan error jika tidak ditemukan. Optimasi Blade View dengan View Composer Jika ada data yang sering digunakan di beberapa view, gunakan View Composer untuk menghindari pengulangan query yang sama: View::composer('partials.menu', function ($view) { $view->with('categories', Category::all()); }); Dengan ini, data kategori akan otomatis tersedia di semua view partials.menu. Meminimalkan Penggunaan Session Start pada Middleware Middleware seperti session start dapat menambah waktu eksekusi jika tidak diperlukan. Gunakan session hanya jika diperlukan pada route tertentu: Route::group(['middleware' => 'web'], function () { Route::get('profile', 'UserController@profile'); }); Monitoring dengan Laravel Telescope Gunakan Laravel Telescope untuk memonitor aplikasi secara real-time. Ini akan membantu kita menemukan query lambat, request yang berat, atau error yang perlu diperbaiki: composer require laravel/telescope php artisan telescope:install php artisan migrate Dengan Telescope, kita bisa melihat log, query yang lambat, dan antrian pekerjaan secara detail. Kesalahan Programmer Pemula Saat Menggunakan Laravel 11 Tanpa Optimasi Ketika baru memulai dengan Laravel, sangat mudah untuk terjebak pada praktik yang kurang optimal. Meskipun Laravel mempermudah pengembangan aplikasi web, ada beberapa kesalahan umum yang sering dilakukan oleh programmer pemula ketika mereka lupa untuk melakukan optimasi pada aplikasi mereka. Berikut ini adalah tiga kesalahan umum beserta contohnya: Menggunakan Query Berulang Kali (N+1 Problem) Kesalahan ini terjadi ketika programmer tidak menyadari bahwa setiap loop yang mengakses relasi data menyebabkan query yang berulang-ulang ke database. Sebagai contoh, ketika menampilkan daftar menu beserta kategori pada halaman utama: $menus = Menu::all(); foreach ($menus as $menu) { echo $menu->category->name; } Pada contoh di atas, setiap kali loop berjalan, Laravel akan mengeksekusi satu query untuk mengambil data kategori dari setiap menu. Jika ada 100 menu, maka akan ada 101 query yang dijalankan. Solusinya adalah menggunakan eager loading: $menus = Menu::with('category')->get(); foreach ($menus as $menu) { echo $menu->category->name; } Dengan cara ini, hanya akan ada dua query yang dieksekusi, satu untuk mengambil semua menu dan satu lagi untuk mengambil semua kategori yang terkait. Mengabaikan Penggunaan Cache Banyak programmer pemula yang tidak memanfaatkan cache, padahal ini adalah salah satu cara paling efektif untuk mengurangi beban pada database dan mempercepat respon aplikasi. Misalnya, ketika mengambil data yang jarang berubah seperti daftar kategori: $categories = Category::all(); // Query ini akan selalu dipanggil setiap kali request dilakukan Untuk mengoptimalkannya, kita bisa menggunakan cache: $categories = Cache::remember('categories', 60, function () { return Category::all(); }); Dengan menggunakan cache, query hanya akan dieksekusi sekali setiap 60 menit, dan data selanjutnya akan diambil dari cache. Ini sangat mengurangi beban pada database dan mempercepat waktu respon. Menggunakan Session atau File Storage untuk Data yang Sering Diakses Menyimpan data yang sering diakses atau berubah-ubah dalam session atau file storage adalah praktik yang kurang baik. Misalnya, menyimpan daftar pesanan pengguna dalam session: session(['orders' => Order::where('user_id', auth()->id())->get()]); Pendekatan ini bisa menyebabkan masalah ketika jumlah data besar, karena akan memakan banyak memori dan memperlambat aplikasi. Solusinya adalah menggunakan database atau cache yang lebih efisien dalam manajemen data: $orders = Cache::remember('orders_user_' . auth()->id(), 60, function () { return Order::where('user_id', auth()->id())->get(); }); Dengan menggunakan cache, kita bisa memastikan bahwa data pesanan diambil dengan lebih cepat tanpa membebani session storage. Menghindari kesalahan-kesalahan ini dan memanfaatkan fitur optimasi yang tersedia di Laravel akan sangat membantu dalam menjaga performa aplikasi agar tetap stabil dan cepat. Sebagai developer, kita harus selalu mencari cara untuk meningkatkan efisiensi kode yang kita tulis. Link atau Panduan untuk Memulai Untuk kamu yang baru ingin mulai belajar Laravel, Buildwithangga menyediakan berbagai kelas yang bisa diakses kapan saja. Langkah pertama yang bisa dilakukan adalah memahami dasar-dasar PHP dan konsep MVC (Model-View-Controller) yang menjadi fondasi dari Laravel. Setelah itu, kamu bisa mengikuti tutorial dasar untuk membuat project sederhana seperti sistem manajemen data dengan fitur CRUD (Create, Read, Update, Delete). Setelah memahami konsep dasar, lanjutkan dengan mempelajari fitur-fitur lanjutan seperti routing, middleware, Eloquent ORM, dan relasi database. Jika ingin lebih mendalami, kamu juga bisa mencoba membuat API dengan Laravel dan mempelajari bagaimana mengintegrasikannya dengan front-end modern seperti Vue.js atau React. Dengan memanfaatkan materi yang ada di Buildwithangga, kamu bisa belajar Laravel secara bertahap, mulai dari dasar hingga tingkat lanjut, dengan bimbingan mentor yang siap membantu jika ada kendala selama proses belajar. Penutup Laravel adalah framework yang cocok dipelajari oleh siapa saja, baik pemula maupun yang sudah berpengalaman, karena menawarkan kemudahan dalam pengembangan aplikasi web yang kompleks dan scalable. Dengan komunitas yang terus berkembang dan dukungan fitur-fitur modern, Laravel diprediksi akan tetap menjadi salah satu framework PHP terpopuler untuk beberapa tahun ke depan. Oleh karena itu, menguasai Laravel bisa menjadi investasi yang sangat berharga, terutama bagi mahasiswa yang sedang mengerjakan proyek skripsi. Untuk mendapatkan pemahaman yang lebih mendalam, kamu bisa belajar Laravel bersama mentor expert dan berpengalaman di Buildwithangga. Dengan akses seumur hidup, kamu akan mendapatkan berbagai benefit, seperti bisa bertanya langsung kepada mentor jika mengalami kendala dalam belajar. Ini akan membantu kamu lebih produktif dan membuat proyek skripsi menjadi lebih menarik dan berkualitas. Jangan lewatkan kesempatan ini untuk meningkatkan skill programming-mu dan jadilah developer yang siap menghadapi tantangan di dunia kerja!

Kelas Tutorial Optimize Projek Laravel 11 Agar Lebih Kuat dan Cepat di BuildWithAngga

Tutorial Optimize Projek Laravel 11 Agar Lebih Kuat dan Cepat

Sebagai seorang web developer, tugas kita bukan hanya sekadar membuat website yang fungsional. Kita juga perlu memastikan bahwa website tersebut dapat diakses dengan cepat, aman, dan mudah dikelola, terutama jika menggunakan framework seperti Laravel 11. Dalam dunia web development, performa dan keandalan website sangat penting untuk memberikan pengalaman terbaik kepada pengguna. Oleh karena itu, kita perlu melakukan beberapa langkah optimisasi pada proyek Laravel 11 kita. Bayangkan sebuah toko online. Jika tokonya berantakan dan sulit ditemukan, pengunjung akan pergi ke tempat lain. Begitu juga dengan website. Jika website lambat atau sering mengalami masalah, pengguna akan beralih ke website lain yang lebih cepat dan stabil. Maka dari itu, penting bagi kita untuk meningkatkan performa dan keandalan website yang kita buat. Mengapa Optimisasi Penting dalam Proyek Laravel 11? Ketika kita bekerja dalam tim dan mengembangkan proyek yang besar, optimisasi sangat penting agar proyek lebih mudah dipelihara dan dikelola bersama-sama. Laravel 11 sendiri sudah menawarkan berbagai fitur yang memudahkan kita dalam membangun website yang kuat, namun ada beberapa hal yang bisa kita lakukan untuk membuatnya lebih baik lagi. Hal ini juga akan meningkatkan skill kita sebagai seorang web developer, karena kita akan lebih memahami bagaimana Laravel bekerja dan bagaimana cara mengoptimalkan penggunaannya. Langkah-langkah Optimisasi Proyek Laravel 11 Untuk memulai optimisasi pada proyek Laravel 11, kita perlu memahami beberapa konsep dasar yang bisa membantu kita dalam meningkatkan performa aplikasi. Berikut ini beberapa langkah yang bisa dilakukan: 1. Menggunakan Caching Caching adalah salah satu cara paling efektif untuk meningkatkan performa aplikasi Laravel. Dengan menyimpan data yang sering diakses di memori, kita bisa mengurangi waktu yang dibutuhkan untuk memproses data tersebut. Laravel menyediakan beberapa jenis caching seperti query caching, view caching, dan route caching. Berikut cara sederhana untuk mengaktifkan caching di Laravel 11: // Mengaktifkan cache pada routes php artisan route:cache // Mengaktifkan cache pada views php artisan view:cache Dengan melakukan caching, kita bisa mengurangi waktu eksekusi aplikasi dan meningkatkan performanya. 2. Menggunakan Eager Loading Eager loading adalah teknik untuk mengurangi jumlah query yang dikirim ke database. Misalnya, ketika kita ingin mengambil data user beserta data postingannya, daripada mengirim dua query yang berbeda, kita bisa menggunakan eager loading untuk mengirim satu query saja. Berikut contoh penggunaan eager loading di Laravel 11: // Mengambil data user beserta data postingannya $users = User::with('posts')->get(); Dengan menggunakan eager loading, kita bisa mengurangi waktu yang dibutuhkan untuk mengambil data dari database. 3. Optimisasi Query Database Optimisasi query adalah langkah penting untuk meningkatkan performa aplikasi Laravel. Kita bisa menggunakan indeks pada tabel database untuk mempercepat proses pencarian data. Selain itu, hindari penggunaan query yang kompleks dan pastikan hanya mengambil data yang dibutuhkan. // Mengambil hanya nama dan email dari tabel users $users = User::select('name', 'email')->get(); Dengan cara ini, kita bisa mengurangi beban pada server database. 4. Menggunakan Observer untuk Memantau Perubahan Data Observer adalah cara yang efektif untuk memisahkan logika bisnis dari model utama. Dengan menggunakan observer, kita bisa memantau perubahan data seperti ketika data dibuat, diperbarui, atau dihapus. Ini sangat berguna untuk menjaga konsistensi data di aplikasi kita. Misalnya, kita bisa menggunakan observer untuk mengirim email notifikasi ketika user baru dibuat. // Membuat observer untuk model User php artisan make:observer UserObserver --model=User Setelah itu, kita bisa mendaftarkan observer tersebut di AppServiceProvider: use App\\\\Models\\\\User; use App\\\\Observers\\\\UserObserver; public function boot() { User::observe(UserObserver::class); } Dengan memanfaatkan observer, kita bisa lebih mudah mengelola logika bisnis dan menjaga kebersihan kode. 5. Memanfaatkan Komposer Autoload Optimisasi Laravel menggunakan autoloading untuk memuat file-file yang dibutuhkan. Kita bisa mengoptimalkan proses ini dengan menggunakan perintah composer dump-autoload -o. Ini akan menghasilkan file autoload yang lebih efisien sehingga aplikasi kita bisa berjalan lebih cepat. composer dump-autoload -o Meningkatkan Skills sebagai Web Developer Dengan melakukan optimisasi pada proyek Laravel 11, kita tidak hanya membuat aplikasi kita lebih cepat dan kuat, tetapi juga meningkatkan pemahaman kita tentang cara kerja Laravel dan bagaimana cara mengoptimalkannya. Ini akan sangat bermanfaat ketika kita bekerja dalam tim atau menangani proyek besar yang memerlukan performa dan keandalan tinggi. Mengoptimalkan Proyek Website Rumah Sakit dengan Laravel 11 Ketika mengerjakan proyek website untuk rumah sakit menggunakan Laravel 11, ada beberapa aspek yang perlu dioptimalkan agar aplikasi berjalan dengan cepat, aman, dan efisien. Optimisasi ini penting karena website rumah sakit sering kali memiliki data yang sensitif dan fitur yang kompleks, seperti manajemen pasien, jadwal dokter, dan pemesanan janji temu. Berikut adalah beberapa hal yang perlu diperhatikan: Memastikan Query Database Efisien Website rumah sakit umumnya memiliki banyak data yang harus dikelola, seperti informasi pasien, dokter, dan rekam medis. Untuk memastikan aplikasi berjalan dengan cepat, penting untuk mengoptimalkan query database agar tidak membebani server. Salah satu caranya adalah dengan menggunakan eager loading untuk mengurangi jumlah query yang dikirim ke database. Contoh penggunaan eager loading: // Mengambil data pasien beserta jadwal konsultasi $patients = Patient::with('appointments')->get(); Dengan menggunakan with(), kita bisa mengambil data pasien dan jadwal konsultasi dalam satu query, sehingga lebih efisien daripada mengambilnya satu per satu. Menggunakan Caching untuk Data yang Sering Diakses Caching dapat meningkatkan performa aplikasi dengan menyimpan data yang sering diakses, seperti daftar dokter atau jadwal praktek. Hal ini akan mengurangi beban pada database karena data yang sama tidak perlu diambil berkali-kali. Laravel menyediakan fitur caching yang mudah digunakan. Contoh penggunaan caching: // Menyimpan daftar dokter dalam cache selama 60 menit $doctors = Cache::remember('doctors', 60, function () { return Doctor::all(); }); Dengan menggunakan Cache::remember(), data dokter akan disimpan dalam cache dan diambil dari sana jika ada permintaan dalam 60 menit ke depan. Mengoptimalkan Middleware untuk Keamanan Keamanan adalah aspek yang sangat penting pada website rumah sakit karena melibatkan data pasien yang sensitif. Laravel 11 menyediakan berbagai macam middleware yang bisa digunakan untuk meningkatkan keamanan aplikasi. Misalnya, kita bisa menggunakan middleware untuk memverifikasi apakah user yang mengakses halaman adalah seorang dokter atau bukan. Contoh penggunaan middleware: // Menambahkan middleware pada route untuk halaman dokter Route::group(['middleware' => ['auth', 'role:doctor']], function () { Route::get('/doctor-dashboard', [DoctorController::class, 'index']); }); Middleware auth memastikan bahwa hanya user yang sudah login yang bisa mengakses halaman tersebut, sementara role:doctor memastikan bahwa hanya user dengan peran dokter yang bisa mengakses halaman dashboard dokter. Optimisasi Penggunaan Storage dan File Handling Website rumah sakit mungkin membutuhkan fitur untuk mengunggah dan menyimpan file, seperti foto pasien atau hasil scan medis. Agar file handling lebih efisien, kita bisa menggunakan sistem penyimpanan Laravel yang mendukung berbagai layanan penyimpanan seperti Amazon S3 atau Google Cloud Storage. Menggunakan penyimpanan cloud dapat mengurangi beban server dan meningkatkan kecepatan akses. Contoh penggunaan storage: // Mengunggah file foto pasien ke storage lokal $filePath = $request->file('photo')->store('patient_photos'); Dengan menggunakan store(), file foto akan disimpan di folder patient_photos yang ada di storage Laravel. Kita bisa dengan mudah mengganti penyimpanan ini ke cloud tanpa harus mengubah kode yang ada. Implementasi Observer untuk Monitoring Perubahan Data Mengelola data pasien atau dokter memerlukan perhatian khusus, terutama jika data tersebut sering berubah. Dengan menggunakan observer, kita bisa memantau perubahan data dan menjalankan logika tertentu seperti mengirim email notifikasi saat data pasien diperbarui atau dokter baru ditambahkan. Contoh implementasi observer dapat dimulai dengan membuat observer untuk model Patient. Gunakan perintah berikut di terminal: php artisan make:observer PatientObserver --model=Patient Setelah observer berhasil dibuat, tambahkan logika yang diinginkan pada file PatientObserver. Misalnya, jika kita ingin mengirim email notifikasi saat data pasien diperbarui, kita bisa menambahkan kode berikut pada fungsi updated: use App\\\\Models\\\\Patient; class PatientObserver { public function updated(Patient $patient) { // Kirim email notifikasi saat data pasien diperbarui Mail::to($patient->email)->send(new PatientUpdated($patient)); } } Terakhir, daftarkan observer ini di AppServiceProvider agar Laravel mengenali dan menggunakan observer yang telah kita buat. Caranya dengan menambahkan kode berikut: use App\\\\Models\\\\Patient; use App\\\\Observers\\\\PatientObserver; public function boot() { Patient::observe(PatientObserver::class); } Dengan implementasi observer ini, kita dapat memastikan bahwa setiap perubahan penting pada data pasien atau dokter dapat dipantau dengan baik dan direspon sesuai kebutuhan aplikasi. Penutup dan saran Laravel adalah salah satu framework PHP yang sangat cocok untuk dipelajari, terutama bagi kamu yang ingin mengembangkan website dengan fitur lengkap dan performa tinggi. Dengan berbagai fitur yang dimilikinya, Laravel telah menjadi pilihan populer di kalangan web developer, dan popularitas ini diperkirakan akan terus meningkat selama beberapa tahun ke depan. Belajar Laravel bukan hanya akan membuka peluang karier yang lebih luas, tetapi juga memudahkan kamu dalam menyelesaikan berbagai proyek, termasuk projek skripsi yang lebih menarik dan inovatif. Untuk memaksimalkan pembelajaran Laravel, kamu bisa belajar bersama mentor expert dan berpengalaman di BuildWithAngga. Di sini, kamu bisa mendapatkan akses seumur hidup ke berbagai materi pembelajaran yang lengkap, serta kesempatan bertanya langsung kepada mentor jika mengalami kendala saat belajar. Dengan dukungan mentor yang siap membantu, proses belajar menjadi lebih produktif dan menyenangkan. Tidak hanya itu, kamu juga bisa bergabung dalam komunitas yang aktif untuk berdiskusi dan saling berbagi ilmu. Jadi, tunggu apa lagi? Yuk, mulai belajar Laravel sekarang juga dan buat proyek skripsi kamu jadi lebih menarik dan bermakna!

Kelas Tutorial Multi Login Filament Admin dan Breeze Customer Website Ecommerce di BuildWithAngga

Tutorial Multi Login Filament Admin dan Breeze Customer Website Ecommerce

Membangun website dengan fitur backend atau admin memerlukan sebuah dashboard untuk mengelola konten. Laravel menyediakan dua package yang sangat membantu dalam hal ini, yaitu Filament dan Breeze. Apa Itu Filament? Filament adalah package Laravel yang memudahkan pembuatan dashboard admin, mirip seperti kotak perkakas lengkap untuk membangun CMS (Content Management System) pada website. Dengan Filament, kita tidak perlu membuat fitur admin dari nol. Package ini sudah menyediakan fitur siap pakai seperti CRUD, manajemen pengguna, dan pengelolaan konten. Bayangkan membangun rumah dengan kontraktor yang sudah menyediakan bahan bangunan, peralatan, dan pekerja ahli. Filament mempersingkat waktu dan tenaga, sehingga kita bisa fokus pada pengembangan fitur lainnya. Keunggulan Filament: User Interface Modern: Tampilan yang menarik dan user-friendly memudahkan admin dalam mengelola konten.Mudah Diintegrasikan: Filament bisa digabungkan dengan package lain yang diperlukan dalam proyek.Customizable: Kita bisa menyesuaikan fitur dan tampilan dashboard sesuai kebutuhan. Apa Itu Breeze? Breeze adalah package Laravel untuk membangun fitur login dan register dengan mudah. Jika Filament adalah kontraktor untuk membangun rumah, Breeze seperti paket starter yang menyediakan pintu dan kunci untuk rumah tersebut. Breeze fokus pada fitur autentikasi dasar seperti login, register, dan verifikasi pengguna. Keunggulan Breeze: Sederhana dan Mudah Digunakan: Cocok untuk proyek yang memerlukan fitur autentikasi dasar.Terintegrasi dengan Laravel: Breeze bekerja mulus dengan fitur Laravel lainnya.Starter Template: Breeze menyediakan template dasar untuk halaman login dan register, memudahkan kita memulai tanpa membuat semuanya dari awal. Mengapa Memilih Filament dan Breeze? Menggunakan Filament dan Breeze ibarat memilih alat yang tepat untuk pekerjaan tertentu. Filament membantu membangun CMS dengan cepat tanpa banyak detail teknis, sedangkan Breeze menyediakan fitur login dan register yang aman dan mudah. Dengan dua package ini, kita bisa menghemat waktu dan fokus pada fitur utama website tanpa perlu membuat semuanya dari nol. Latihan Membuat Dua Dashboard Berbeda dengan Filament dan Breeze Kali ini kita akan melakukan latihan menggunakan dua package Laravel yang sangat membantu, yaitu Filament dan Breeze, untuk membuat dua dashboard yang berbeda. Dashboard pertama akan kita buat untuk admin menggunakan Filament. Dashboard ini akan digunakan oleh admin untuk mengelola konten website, seperti menambah, mengedit, atau menghapus data dengan lebih mudah. Sementara itu, dashboard kedua akan kita buat untuk customer menggunakan Breeze. Dashboard ini akan fokus pada fitur-fitur yang berhubungan dengan pengguna biasa, seperti login, registrasi, dan manajemen profil. Dengan Breeze, kita bisa menyediakan halaman-halaman sederhana yang mudah digunakan oleh customer. Dengan menggunakan dua package ini, kita bisa membedakan antara hak akses dan tampilan untuk admin dan customer. Ini akan membantu kita mengelola website dengan lebih baik dan memberikan pengalaman pengguna yang optimal bagi kedua tipe pengguna tersebut. Tutorial Membuat Proyek Sewa Barang dengan Laravel 11 Pada tutorial ini, kita akan membuat proyek sewa barang menggunakan Laravel 11. Kita akan memulai dari tahap instalasi hingga membuat fitur-fitur penting seperti manajemen barang, pelanggan, dan transaksi sewa. Selain itu, kita juga akan mengintegrasikan package Filament untuk dashboard admin dan Breeze untuk fitur autentikasi customer. 1) Membuat Proyek Laravel 11 Pertama-tama, kita perlu membuat proyek Laravel 11. Pastikan Anda sudah menginstal Composer dan PHP di sistem Anda. composer create-project laravel/laravel sewa-barang "11.*" Setelah proyek selesai diunduh, masuk ke folder proyek dengan perintah berikut: cd sewa-barang 2) Menyiapkan Database Buat database baru di MySQL, misalnya dengan nama sewa_barang. Kemudian, buka file .env di proyek Laravel dan sesuaikan konfigurasi database seperti berikut: DB_DATABASE=sewa_barang DB_USERNAME=root DB_PASSWORD= Jangan lupa untuk menjalankan migrasi awal untuk membuat tabel-tabel bawaan Laravel: php artisan migrate 3) Membuat Model dan Migration Kita akan membuat model dan migration untuk entitas yang diperlukan, seperti Barang, Pelanggan, dan TransaksiSewa. php artisan make:model Barang -m php artisan make:model Pelanggan -m php artisan make:model TransaksiSewa -m Kemudian, buka file migrasi di folder database/migrations dan tambahkan struktur tabelnya. Barang Migration: Schema::create('barangs', function (Blueprint $table) { $table->id(); $table->string('nama'); $table->text('deskripsi'); $table->integer('stok'); $table->decimal('harga_sewa', 10, 2); $table->timestamps(); }); Pelanggan Migration: Schema::create('pelanggans', function (Blueprint $table) { $table->id(); $table->string('nama'); $table->string('email')->unique(); $table->string('telepon'); $table->text('alamat'); $table->timestamps(); }); TransaksiSewa Migration: Schema::create('transaksi_sewas', function (Blueprint $table) { $table->id(); $table->foreignId('barang_id')->constrained('barangs'); $table->foreignId('pelanggan_id')->constrained('pelanggans'); $table->date('tanggal_mulai'); $table->date('tanggal_selesai'); $table->decimal('total_harga', 10, 2); $table->timestamps(); }); Jalankan migrasi untuk membuat tabel-tabel tersebut: php artisan migrate 4) Membuat Relasi Antar Model Selanjutnya, tambahkan relasi antar model. Buka file model Barang, Pelanggan, dan TransaksiSewa yang berada di folder app/Models. Barang Model: public function transaksiSewa() { return $this->hasMany(TransaksiSewa::class); } Pelanggan Model: public function transaksiSewa() { return $this->hasMany(TransaksiSewa::class); } TransaksiSewa Model: public function barang() { return $this->belongsTo(Barang::class); } public function pelanggan() { return $this->belongsTo(Pelanggan::class); } Menginstall Package Filament dan Breeze 1) Menginstall Filament Filament digunakan untuk membuat dashboard admin. Instalasi Filament sangat mudah dan bisa dilakukan dengan langkah berikut: Jalankan perintah berikut untuk menginstal Filament: composer require filament/filament Setelah instalasi selesai, jalankan perintah berikut untuk mempublikasikan aset dan konfigurasi Filament: php artisan filament:install Buat user admin untuk login ke dashboard Filament: php artisan make:filament-user Ikuti instruksi yang muncul untuk membuat akun admin. 2) Menginstall Breeze Breeze digunakan untuk fitur autentikasi seperti login dan register untuk customer. Jalankan perintah berikut untuk menginstal Breeze: composer require laravel/breeze --dev Jalankan perintah untuk menginstal scaffolding Breeze: php artisan breeze:install Pilih Blade atau React sesuai kebutuhan tampilan autentikasi Anda, lalu jalankan perintah: npm install && npm run dev Jalankan migrasi untuk membuat tabel pengguna: php artisan migrate Dengan instalasi Filament dan Breeze, kita bisa memiliki dua dashboard yang berbeda: satu untuk admin dengan Filament dan satu untuk customer dengan Breeze. Selanjutnya, kita bisa mengembangkan fitur-fitur lebih lanjut seperti manajemen barang dan transaksi sewa. Membuat Akun Super Admin dan Resource di Filament Dalam proyek Laravel yang menggunakan Filament untuk dashboard admin, kita bisa dengan mudah membuat akun super admin dan resource yang dibutuhkan untuk mengelola data. Berikut adalah langkah-langkah membuat akun super admin menggunakan command Artisan, serta cara membuat resource seperti barang, pelanggan, dan transaksi. Membuat Akun Super Admin dengan Command Artisan Pastikan Filament sudah terinstal di proyek Laravel Anda. Jika belum, Anda bisa menginstalnya dengan perintah berikut: composer require filament/filament Untuk membuat akun super admin, jalankan command Artisan berikut: php artisan make:filament-user Anda akan diminta memasukkan beberapa informasi seperti nama, email, dan password. Masukkan informasi yang sesuai. Name: Super Admin Email: [email protected] Password: ***** Is Super Admin? (yes/no) [no]: yes Dengan memilih yes saat ditanya apakah akun tersebut adalah super admin, Anda memberikan hak akses penuh pada akun tersebut. Akun super admin ini dapat login ke dashboard Filament menggunakan email dan password yang sudah ditentukan. Membuat Resource di Filament Untuk mengelola data dari dashboard admin, kita bisa membuat resource di Filament. Resource ini memungkinkan kita untuk membuat fitur CRUD (Create, Read, Update, Delete) secara otomatis untuk model tertentu. Untuk membuat resource Barang, jalankan command berikut: php artisan make:filament-resource Barang Ini akan menghasilkan resource lengkap dengan file form dan table di folder app/Filament/Resources/BarangResource. Anda bisa menyesuaikan field di form dan table sesuai dengan struktur tabel Barang. Selanjutnya, untuk membuat resource Pelanggan, jalankan command: php artisan make:filament-resource Pelanggan Resource ini memungkinkan Anda untuk mengelola data pelanggan langsung dari dashboard. File resource akan dihasilkan di folder app/Filament/Resources/PelangganResource, dan Anda bisa menyesuaikan field dan validasi yang diperlukan. Terakhir, buat resource untuk TransaksiSewa dengan perintah: php artisan make:filament-resource TransaksiSewa Dengan resource ini, admin dapat mengelola transaksi sewa barang. File resource akan berada di folder app/Filament/Resources/TransaksiSewaResource. Anda dapat menambahkan validasi khusus atau menyesuaikan tampilan form sesuai dengan kebutuhan bisnis. Mengatur Form dan Table pada Resource Barang di Filament Dalam resource Barang, kita bisa mengatur tampilan form dan table agar sesuai dengan kebutuhan pengelolaan data barang. Pengaturan ini meliputi penambahan field, validasi, dan tampilan table yang lebih informatif. Berikut ini adalah cara mengatur form dan table pada file BarangResource.php. Mengatur Form pada Resource Barang Buka file BarangResource.php yang berada di folder app/Filament/Resources/BarangResource. Pada method form(), tambahkan field-field yang diperlukan. Misalnya, kita ingin menambahkan field nama, deskripsi, stok, dan harga_sewa. Berikut contoh konfigurasinya: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('nama') ->required() ->label('Nama Barang'), Textarea::make('deskripsi') ->required() ->label('Deskripsi Barang'), NumberInput::make('stok') ->required() ->label('Stok Barang') ->min(1), TextInput::make('harga_sewa') ->required() ->label('Harga Sewa') ->numeric(), ]); } Penjelasan: TextInput::make('nama') membuat input teks untuk nama barang dengan validasi required.Textarea::make('deskripsi') membuat area teks untuk deskripsi barang.NumberInput::make('stok') membuat input angka untuk stok barang dengan minimum nilai 1.TextInput::make('harga_sewa') membuat input teks untuk harga sewa yang diharuskan numerik. Anda juga bisa menambahkan validasi tambahan atau logika khusus pada field dengan chaining method seperti minLength(), maxLength(), atau regex() sesuai kebutuhan. Mengatur Table pada Resource Barang Pada method table(), tambahkan kolom-kolom yang ingin ditampilkan di table. Berikut ini adalah contoh pengaturan table: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id') ->label('ID') ->sortable(), TextColumn::make('nama') ->label('Nama Barang') ->sortable() ->searchable(), TextColumn::make('stok') ->label('Stok') ->sortable(), TextColumn::make('harga_sewa') ->label('Harga Sewa') ->money('idr', true), TextColumn::make('created_at') ->label('Tanggal Dibuat') ->dateTime('d-M-Y H:i'), ]) ->filters([ // Tambahkan filter jika diperlukan ]) ->actions([ Tables\\\\Actions\\\\EditAction::make(), Tables\\\\Actions\\\\DeleteAction::make(), ]) ->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } Penjelasan: TextColumn::make('id') menampilkan kolom ID dengan opsi sortable.TextColumn::make('nama') menampilkan nama barang yang bisa diurutkan dan dicari.TextColumn::make('stok') menampilkan stok barang.TextColumn::make('harga_sewa') menampilkan harga sewa dengan format mata uang Rupiah.TextColumn::make('created_at') menampilkan tanggal pembuatan dalam format d-M-Y H:i. Anda bisa menambahkan filter untuk memudahkan pencarian data spesifik dengan menambahkan konfigurasi pada >filters([]). Tambahkan aksi seperti edit dan delete untuk memudahkan pengelolaan data langsung dari table dengan konfigurasi pada >actions([]). Mengatur Form dan Table pada Resource Pelanggan Untuk mengelola data pelanggan dengan lebih efektif di dashboard admin, kita perlu mengatur form dan table pada resource Pelanggan. Berikut langkah-langkahnya: Mengatur Form pada Resource Pelanggan Buka file PelangganResource.php yang berada di folder app/Filament/Resources/PelangganResource. Pada method form(), tambahkan field-field yang diperlukan untuk input data pelanggan seperti nama, email, telepon, dan alamat. Berikut contoh konfigurasinya: public static function form(Form $form): Form { return $form ->schema([ TextInput::make('nama') ->required() ->label('Nama Lengkap'), TextInput::make('email') ->required() ->email() ->label('Email'), TextInput::make('telepon') ->required() ->label('Nomor Telepon'), Textarea::make('alamat') ->required() ->label('Alamat Lengkap'), ]); } Penjelasan: TextInput::make('nama') membuat input teks untuk nama lengkap pelanggan dengan validasi required.TextInput::make('email') membuat input teks untuk email dengan validasi required dan format email.TextInput::make('telepon') membuat input teks untuk nomor telepon yang juga diharuskan.Textarea::make('alamat') membuat area teks untuk alamat lengkap pelanggan. Sesuaikan field dan validasi sesuai kebutuhan, misalnya menambahkan validasi unik untuk email agar tidak ada data duplikat. Mengatur Table pada Resource Pelanggan Pada method table(), tambahkan kolom-kolom yang ingin ditampilkan di table, seperti id, nama, email, telepon, dan alamat. Berikut ini adalah contoh pengaturan table: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id') ->label('ID') ->sortable(), TextColumn::make('nama') ->label('Nama Pelanggan') ->sortable() ->searchable(), TextColumn::make('email') ->label('Email') ->sortable() ->searchable(), TextColumn::make('telepon') ->label('Telepon') ->sortable(), TextColumn::make('alamat') ->label('Alamat') ->wrap(), TextColumn::make('created_at') ->label('Tanggal Bergabung') ->dateTime('d-M-Y H:i'), ]) ->filters([ // Tambahkan filter jika diperlukan ]) ->actions([ Tables\\\\Actions\\\\EditAction::make(), Tables\\\\Actions\\\\DeleteAction::make(), ]) ->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } Penjelasan: TextColumn::make('id') menampilkan ID pelanggan dengan opsi sortable.TextColumn::make('nama') dan TextColumn::make('email') bisa diurutkan dan dicari, memudahkan pencarian data spesifik.TextColumn::make('telepon') dan TextColumn::make('alamat') menampilkan data nomor telepon dan alamat pelanggan.TextColumn::make('created_at') menampilkan tanggal pelanggan bergabung dengan format d-M-Y H:i. Anda dapat menambahkan filter atau aksi lainnya sesuai dengan kebutuhan untuk memudahkan pengelolaan data pelanggan langsung dari table. Mengatur Form dan Table pada Resource TransaksiSewa Resource TransaksiSewa digunakan untuk mengelola data transaksi penyewaan barang. Berikut cara mengatur form dan table pada resource ini. Mengatur Form pada Resource TransaksiSewa Buka file TransaksiSewaResource.php yang berada di folder app/Filament/Resources/TransaksiSewaResource. Pada method form(), tambahkan field-field yang diperlukan untuk input data transaksi sewa, seperti barang_id, pelanggan_id, tanggal_mulai, tanggal_selesai, dan total_harga. Berikut contoh konfigurasinya: public static function form(Form $form): Form { return $form ->schema([ Select::make('barang_id') ->relationship('barang', 'nama') ->required() ->label('Barang yang Disewa'), Select::make('pelanggan_id') ->relationship('pelanggan', 'nama') ->required() ->label('Nama Pelanggan'), DatePicker::make('tanggal_mulai') ->required() ->label('Tanggal Mulai Sewa'), DatePicker::make('tanggal_selesai') ->required() ->label('Tanggal Selesai Sewa'), TextInput::make('total_harga') ->required() ->numeric() ->label('Total Harga Sewa'), ]); } Penjelasan: Select::make('barang_id') membuat dropdown untuk memilih barang yang disewa berdasarkan relasi dengan model Barang.Select::make('pelanggan_id') membuat dropdown untuk memilih pelanggan berdasarkan relasi dengan model Pelanggan.DatePicker::make('tanggal_mulai') dan DatePicker::make('tanggal_selesai') digunakan untuk memilih tanggal mulai dan selesai penyewaan.TextInput::make('total_harga') membuat input teks untuk total harga sewa dengan format numerik. Pastikan relasi barang dan pelanggan sudah didefinisikan pada model TransaksiSewa agar data bisa ditampilkan dengan benar di dropdown. Mengatur Table pada Resource TransaksiSewa Pada method table(), tambahkan kolom-kolom yang ingin ditampilkan di table seperti id, barang.nama, pelanggan.nama, tanggal_mulai, tanggal_selesai, dan total_harga. Berikut ini adalah contoh pengaturan table: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id') ->label('ID') ->sortable(), TextColumn::make('barang.nama') ->label('Barang') ->sortable() ->searchable(), TextColumn::make('pelanggan.nama') ->label('Pelanggan') ->sortable() ->searchable(), TextColumn::make('tanggal_mulai') ->label('Tanggal Mulai') ->dateTime('d-M-Y'), TextColumn::make('tanggal_selesai') ->label('Tanggal Selesai') ->dateTime('d-M-Y'), TextColumn::make('total_harga') ->label('Total Harga') ->money('idr', true), ]) ->filters([ // Tambahkan filter jika diperlukan ]) ->actions([ Tables\\\\Actions\\\\EditAction::make(), Tables\\\\Actions\\\\DeleteAction::make(), ]) ->bulkActions([ Tables\\\\Actions\\\\DeleteBulkAction::make(), ]); } Penjelasan: TextColumn::make('id') menampilkan ID transaksi.TextColumn::make('barang.nama') dan TextColumn::make('pelanggan.nama') menampilkan nama barang dan nama pelanggan yang terhubung dengan relasi barang dan pelanggan.TextColumn::make('tanggal_mulai') dan TextColumn::make('tanggal_selesai') menampilkan tanggal mulai dan selesai penyewaan.TextColumn::make('total_harga') menampilkan total harga sewa dengan format mata uang Rupiah. Anda bisa menambahkan filter tambahan untuk memudahkan pencarian data transaksi berdasarkan tanggal atau pelanggan. Membuat Halaman Barang dan Transaksi untuk Customer Menggunakan Breeze Setelah customer berhasil mendaftar dan login menggunakan Breeze, kita perlu menyediakan halaman khusus untuk menampilkan data barang yang tersedia serta riwayat transaksi penyewaan mereka. Berikut adalah langkah-langkah lengkap untuk membuat halaman Barang dan Transaksi yang dapat diakses oleh customer. Mengatur Rute dan Controller Pertama, buat dua controller baru untuk mengelola halaman barang dan transaksi: php artisan make:controller Customer/BarangController php artisan make:controller Customer/TransaksiController Dua controller ini akan menangani logika untuk menampilkan barang dan transaksi kepada customer. Pada file BarangController.php, tambahkan method index() untuk menampilkan daftar barang: namespace App\\\\Http\\\\Controllers\\\\Customer; use App\\\\Http\\\\Controllers\\\\Controller; use App\\\\Models\\\\Barang; class BarangController extends Controller { public function index() { $barangs = Barang::all(); // Mengambil semua data barang return view('customer.barang.index', compact('barangs')); } } Selanjutnya, pada file TransaksiController.php, tambahkan method index() untuk menampilkan riwayat transaksi customer: namespace App\\\\Http\\\\Controllers\\\\Customer; use App\\\\Http\\\\Controllers\\\\Controller; use App\\\\Models\\\\TransaksiSewa; use Illuminate\\\\Support\\\\Facades\\\\Auth; class TransaksiController extends Controller { public function index() { $transaksis = TransaksiSewa::where('pelanggan_id', Auth::id())->get(); // Mengambil transaksi berdasarkan ID customer return view('customer.transaksi.index', compact('transaksis')); } } Pada method ini, kita menggunakan Auth::id() untuk mengambil ID customer yang sedang login. Selanjutnya, buat rute di file web.php untuk mengakses halaman barang dan transaksi: Route::middleware(['auth'])->group(function () { Route::get('/barang', [App\\\\Http\\\\Controllers\\\\Customer\\\\BarangController::class, 'index'])->name('customer.barang.index'); Route::get('/transaksi', [App\\\\Http\\\\Controllers\\\\Customer\\\\TransaksiController::class, 'index'])->name('customer.transaksi.index'); }); Pastikan rute ini dilindungi oleh middleware auth agar hanya customer yang sudah login yang bisa mengaksesnya. Membuat View untuk Halaman Barang Buat folder barang di dalam folder resources/views/customer dan buat file index.blade.php di dalamnya. File ini akan menampilkan daftar barang yang tersedia untuk disewa. Pada file index.blade.php, tambahkan kode berikut untuk menampilkan daftar barang: @extends('layouts.app') @section('content') <div class="container"> <h1>Daftar Barang</h1> <div class="row"> @foreach($barangs as $barang) <div class="col-md-4"> <div class="card mb-4"> <div class="card-body"> <h5 class="card-title">{{ $barang->nama }}</h5> <p class="card-text">{{ $barang->deskripsi }}</p> <p class="card-text">Stok: {{ $barang->stok }}</p> <p class="card-text">Harga Sewa: Rp{{ number_format($barang->harga_sewa, 0, ',', '.') }}</p> <a href="#" class="btn btn-primary">Sewa Sekarang</a> </div> </div> </div> @endforeach </div> </div> @endsection Penjelasan: Menggunakan @foreach($barangs as $barang) untuk menampilkan daftar barang dalam bentuk kartu.Setiap barang akan memiliki informasi seperti nama, deskripsi, stok, dan harga sewa. Membuat View untuk Halaman Transaksi Buat folder transaksi di dalam folder resources/views/customer dan buat file index.blade.php di dalamnya. File ini akan menampilkan riwayat transaksi penyewaan barang oleh customer. Pada file index.blade.php, tambahkan kode berikut untuk menampilkan daftar transaksi: @extends('layouts.app') @section('content') <div class="container"> <h1>Riwayat Transaksi</h1> <table class="table table-striped"> <thead> <tr> <th>ID</th> <th>Barang</th> <th>Tanggal Mulai</th> <th>Tanggal Selesai</th> <th>Total Harga</th> </tr> </thead> <tbody> @foreach($transaksis as $transaksi) <tr> <td>{{ $transaksi->id }}</td> <td>{{ $transaksi->barang->nama }}</td> <td>{{ $transaksi->tanggal_mulai->format('d-m-Y') }}</td> <td>{{ $transaksi->tanggal_selesai->format('d-m-Y') }}</td> <td>Rp{{ number_format($transaksi->total_harga, 0, ',', '.') }}</td> </tr> @endforeach </tbody> </table> </div> @endsection Penjelasan: Menampilkan data transaksi dalam bentuk tabel dengan kolom seperti ID transaksi, nama barang, tanggal mulai dan selesai sewa, serta total harga.Menggunakan relasi barang->nama untuk menampilkan nama barang yang disewa pada setiap transaksi. Membuat Fitur Penyewaan Barang oleh Customer Untuk memungkinkan customer menyewa barang, kita perlu menambahkan beberapa fitur, termasuk form pemesanan, logika penyewaan, dan penyimpanan transaksi ke dalam database. Berikut adalah langkah-langkah lengkap untuk membuat fitur ini. Menambahkan Rute dan Controller untuk Proses Penyewaan Buat method baru sewa() di dalam BarangController untuk menampilkan form penyewaan barang: public function sewa($id) { $barang = Barang::findOrFail($id); // Mengambil data barang berdasarkan ID return view('customer.barang.sewa', compact('barang')); } Buat method storeSewa() di dalam BarangController untuk menyimpan data transaksi penyewaan: public function storeSewa(Request $request, $id) { $request->validate([ 'tanggal_mulai' => 'required|date', 'tanggal_selesai' => 'required|date|after:tanggal_mulai', ]); $barang = Barang::findOrFail($id); // Hitung total harga sewa $total_harga = $barang->harga_sewa * $request->input('lama_sewa'); // Simpan transaksi sewa TransaksiSewa::create([ 'barang_id' => $barang->id, 'pelanggan_id' => Auth::id(), 'tanggal_mulai' => $request->input('tanggal_mulai'), 'tanggal_selesai' => $request->input('tanggal_selesai'), 'total_harga' => $total_harga, ]); // Kurangi stok barang $barang->stok -= 1; $barang->save(); return redirect()->route('customer.transaksi.index')->with('success', 'Barang berhasil disewa!'); } Penjelasan: storeSewa() memvalidasi input dari form, menghitung total harga sewa, menyimpan data transaksi ke tabel transaksi_sewa, dan mengurangi stok barang. Tambahkan rute baru di web.php untuk proses penyewaan barang: Route::middleware(['auth'])->group(function () { Route::get('/barang/{id}/sewa', [App\\\\Http\\\\Controllers\\\\Customer\\\\BarangController::class, 'sewa'])->name('customer.barang.sewa'); Route::post('/barang/{id}/sewa', [App\\\\Http\\\\Controllers\\\\Customer\\\\BarangController::class, 'storeSewa'])->name('customer.barang.storeSewa'); }); Penjelasan: Rute get digunakan untuk menampilkan form penyewaan.Rute post digunakan untuk menyimpan data penyewaan setelah customer mengisi form. Membuat View untuk Form Penyewaan Barang Buat file sewa.blade.php di dalam folder resources/views/customer/barang. File ini akan berfungsi sebagai form untuk penyewaan barang. Tambahkan kode berikut pada file sewa.blade.php: @extends('layouts.app') @section('content') <div class="container"> <h1>Sewa Barang: {{ $barang->nama }}</h1> <form method="POST" action="{{ route('customer.barang.storeSewa', $barang->id) }}"> @csrf <div class="mb-3"> <label for="tanggal_mulai" class="form-label">Tanggal Mulai Sewa</label> <input type="date" class="form-control" id="tanggal_mulai" name="tanggal_mulai" required> </div> <div class="mb-3"> <label for="tanggal_selesai" class="form-label">Tanggal Selesai Sewa</label> <input type="date" class="form-control" id="tanggal_selesai" name="tanggal_selesai" required> </div> <button type="submit" class="btn btn-primary">Sewa Sekarang</button> </form> </div> @endsection Penjelasan: Form ini memungkinkan customer untuk memasukkan tanggal mulai dan tanggal selesai sewa.Aksi form mengarah ke method storeSewa() yang akan memproses data penyewaan. Menampilkan Data Penyewaan pada Halaman Transaksi Pada file TransaksiController.php, pastikan data barang yang disewa juga ditampilkan pada view index.blade.php di halaman transaksi: public function index() { $transaksis = TransaksiSewa::with('barang') // Menambahkan relasi barang ->where('pelanggan_id', Auth::id()) ->get(); return view('customer.transaksi.index', compact('transaksis')); } Tambahkan data barang di tabel transaksi di view index.blade.php: @extends('layouts.app') @section('content') <div class="container"> <h1>Riwayat Transaksi</h1> <table class="table table-striped"> <thead> <tr> <th>ID</th> <th>Barang</th> <th>Tanggal Mulai</th> <th>Tanggal Selesai</th> <th>Total Harga</th> </tr> </thead> <tbody> @foreach($transaksis as $transaksi) <tr> <td>{{ $transaksi->id }}</td> <td>{{ $transaksi->barang->nama }}</td> <td>{{ $transaksi->tanggal_mulai->format('d-m-Y') }}</td> <td>{{ $transaksi->tanggal_selesai->format('d-m-Y') }}</td> <td>Rp{{ number_format($transaksi->total_harga, 0, ',', '.') }}</td> </tr> @endforeach </tbody> </table> </div> @endsection Penjelasan: Data barang yang disewa ditampilkan menggunakan relasi barang->nama.Semua transaksi disusun berdasarkan ID, nama barang, tanggal mulai, tanggal selesai, dan total harga. Cara Admin Mengkonfirmasi Transaksi dari Customer melalui Halaman Admin Filament Untuk mengelola dan mengkonfirmasi transaksi dari customer, admin dapat menggunakan halaman admin yang sudah disiapkan menggunakan Filament. Berikut adalah langkah-langkah yang perlu dilakukan untuk menambahkan fitur konfirmasi transaksi pada dashboard admin Filament. Menambahkan Status Konfirmasi pada Tabel TransaksiSewa Tambahkan kolom status pada tabel transaksi_sewas untuk menyimpan status konfirmasi transaksi. Buka file migrasi untuk transaksi_sewas atau buat migrasi baru untuk menambahkan kolom ini: php artisan make:migration add_status_to_transaksi_sewas_table --table=transaksi_sewas Pada file migrasi yang baru dibuat, tambahkan kolom status: Schema::table('transaksi_sewas', function (Blueprint $table) { $table->string('status')->default('pending'); // Default status adalah 'pending' }); Jalankan migrasi: php artisan migrate Dengan penambahan kolom ini, setiap transaksi yang masuk akan memiliki status pending secara default. Mengubah Resource TransaksiSewa di Filament Buka file TransaksiSewaResource.php yang ada di app/Filament/Resources/TransaksiSewaResource. Pada bagian form, tambahkan field status sebagai dropdown agar admin bisa memilih status konfirmasi: Select::make('status') ->options([ 'pending' => 'Pending', 'confirmed' => 'Confirmed', 'rejected' => 'Rejected', ]) ->label('Status Konfirmasi') ->required(), Pada bagian table, tambahkan kolom status agar admin bisa melihat status transaksi secara langsung: TextColumn::make('status') ->label('Status') ->sortable(), Dengan perubahan ini, admin bisa melihat dan mengubah status transaksi langsung dari halaman daftar transaksi di Filament. Menambahkan Aksi Kustom untuk Konfirmasi Transaksi Untuk memudahkan admin mengkonfirmasi transaksi, tambahkan aksi kustom di bagian table() pada file TransaksiSewaResource.php: public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('id')->label('ID'), TextColumn::make('barang.nama')->label('Barang'), TextColumn::make('pelanggan.nama')->label('Pelanggan'), TextColumn::make('tanggal_mulai')->label('Tanggal Mulai')->dateTime('d-M-Y'), TextColumn::make('tanggal_selesai')->label('Tanggal Selesai')->dateTime('d-M-Y'), TextColumn::make('total_harga')->label('Total Harga')->money('idr', true), TextColumn::make('status')->label('Status')->sortable(), ]) ->actions([ Tables\\\\Actions\\\\EditAction::make(), Tables\\\\Actions\\\\DeleteAction::make(), Action::make('confirm') ->label('Konfirmasi') ->action(function ($record) { $record->status = 'confirmed'; $record->save(); Notification::make() ->title('Transaksi dikonfirmasi!') ->success() ->send(); }) ->visible(fn ($record) => $record->status === 'pending'), // Hanya tampil jika status pending Action::make('reject') ->label('Tolak') ->action(function ($record) { $record->status = 'rejected'; $record->save(); Notification::make() ->title('Transaksi ditolak!') ->danger() ->send(); }) ->visible(fn ($record) => $record->status === 'pending'), // Hanya tampil jika status pending ]); } Penjelasan: Aksi confirm dan reject ditambahkan untuk memudahkan admin mengubah status transaksi menjadi confirmed atau rejected.Aksi ini hanya akan terlihat jika status transaksi masih pending. Menggunakan Halaman Admin untuk Konfirmasi Setelah melakukan konfigurasi di atas, admin dapat masuk ke dashboard Filament, kemudian memilih menu Transaksi Sewa. Di sana, admin akan melihat daftar transaksi dengan opsi untuk mengedit, menghapus, atau mengkonfirmasi transaksi. Untuk mengkonfirmasi, admin cukup mengklik tombol Konfirmasi pada transaksi yang statusnya masih pending. Setelah itu, status transaksi akan berubah menjadi confirmed, dan customer akan mengetahui bahwa transaksi mereka telah dikonfirmasi. Dengan cara ini, admin dapat dengan mudah mengelola dan mengkonfirmasi transaksi penyewaan barang langsung dari halaman admin Filament tanpa perlu masuk ke database secara manual. Penutup Laravel adalah framework PHP yang sangat cocok dipelajari, terutama bagi yang ingin mengembangkan aplikasi web dengan cepat dan efisien. Dengan fitur-fitur modern yang dimilikinya, Laravel tidak hanya memudahkan pengembangan proyek skala kecil hingga besar, tetapi juga tetap relevan dan populer untuk beberapa tahun ke depan. Bagi Anda yang sedang mencari platform belajar Laravel yang komprehensif, BuildWithAngga adalah tempat yang tepat. Bersama para mentor expert dan berpengalaman, Anda bisa mempelajari Laravel dari dasar hingga tingkat lanjutan. Belajar di BuildWithAngga memberikan Anda akses seumur hidup ke semua kelas dan materi, sehingga Anda bisa belajar kapan saja dan di mana saja. Tidak hanya itu, jika Anda menemui kendala dalam proses belajar atau mengerjakan proyek seperti skripsi, Anda bisa bertanya langsung kepada mentor. Dengan demikian, Anda akan lebih produktif dan proyek skripsi Anda menjadi lebih menarik serta memiliki nilai lebih. Ayo, belajar Laravel sekarang di BuildWithAngga dan raih pengalaman belajar yang menyenangkan bersama para mentor terbaik!

Kelas 5 Contoh Tutorial Penggunaan Observer Laravel 11 Pada Projek Website Sewa Rumah di BuildWithAngga

5 Contoh Tutorial Penggunaan Observer Laravel 11 Pada Projek Website Sewa Rumah

Pada artikel ini, kita akan membahas penggunaan Observer pada Laravel 11 dan bagaimana penerapannya dalam proyek website sewa rumah. Observer merupakan fitur Laravel yang memudahkan kita untuk menangani event yang terjadi pada model, seperti saat data disimpan, diperbarui, atau dihapus. Dengan Observer, kita dapat mengeksekusi kode tertentu secara otomatis ketika ada perubahan pada model, sehingga proses pengembangan menjadi lebih rapi dan efisien. Analogi sederhana untuk memahami Observer adalah seperti seorang pengelola properti yang bertugas mencatat setiap perubahan yang terjadi di kompleks perumahan. Ketika ada penyewa baru yang masuk, pengelola ini akan mencatat data penyewa, mengirim notifikasi kepada pemilik rumah, dan memperbarui status rumah secara otomatis. Dengan menggunakan Observer, kita bisa memastikan semua proses berjalan tanpa perlu menambah kode secara manual di berbagai tempat. Namun, apa bedanya menggunakan Observer dengan tidak menggunakan Observer? Jika kita tidak menggunakan Observer, setiap event yang terjadi pada model harus ditangani di berbagai tempat seperti di controller atau service layer. Hal ini dapat menyebabkan kode menjadi berantakan, sulit dirawat, dan rawan kesalahan. Sementara dengan Observer, kita bisa memusatkan logika bisnis yang berkaitan dengan event pada satu tempat saja, sehingga kode lebih terstruktur dan mudah dikelola. Berikut ini adalah lima contoh penggunaan Observer Laravel 11 pada proyek website sewa rumah, lengkap dengan kode dan penjelasan. Perbedaan Menggunakan Observer dan Tidak Menggunakan Observer Tanpa Observer: Ketika kita tidak menggunakan Observer, kita harus menulis logika bisnis terkait event pada model di berbagai tempat, misalnya di controller atau service layer. Misalnya, jika kita ingin mencatat riwayat penyewaan setiap kali ada penyewa baru, kita perlu menambahkan kode pencatatan ini di setiap controller yang menangani penyewaan. // Controller Penyewaan public function store(Request $request) { $penyewaan = Penyewaan::create($request->all()); // Menyimpan riwayat penyewaan di sini RiwayatPenyewaan::create([ 'penyewaan_id' => $penyewaan->id, 'rumah_id' => $penyewaan->rumah_id, 'penyewa_id' => $penyewaan->penyewa_id, 'tanggal_mulai' => $penyewaan->tanggal_mulai, 'tanggal_selesai' => $penyewaan->tanggal_selesai, 'status' => 'Penyewaan baru' ]); // Logika lainnya... } Kode di atas harus diulang setiap kali kita ingin menyimpan riwayat penyewaan, baik di controller lain atau pada fungsi lain yang menangani penyewaan. Ini akan membuat kode menjadi sulit dikelola dan rentan kesalahan jika kita lupa menambahkan logika ini di tempat lain. Dengan Observer: Menggunakan Observer memungkinkan kita memusatkan logika bisnis yang berkaitan dengan event pada satu tempat, sehingga kode lebih terstruktur dan terorganisir. // Observer Penyewaan namespace App\\\\Observers; use App\\\\Models\\\\Penyewaan; use App\\\\Models\\\\RiwayatPenyewaan; class PenyewaanObserver { public function created(Penyewaan $penyewaan) { RiwayatPenyewaan::create([ 'penyewaan_id' => $penyewaan->id, 'rumah_id' => $penyewaan->rumah_id, 'penyewa_id' => $penyewaan->penyewa_id, 'tanggal_mulai' => $penyewaan->tanggal_mulai, 'tanggal_selesai' => $penyewaan->tanggal_selesai, 'status' => 'Penyewaan baru' ]); } } Dengan Observer, kita cukup menulis logika bisnis ini satu kali di PenyewaanObserver dan mendaftarkannya di AppServiceProvider, sehingga akan otomatis berjalan setiap kali ada event created pada model Penyewaan. Kode ini lebih mudah dikelola dan lebih rapi. Contoh Penerapan Observer pada Proyek Website Sewa Rumah 1. Menyimpan Riwayat Penyewaan Ketika Ada Transaksi Baru Setiap kali ada transaksi penyewaan baru, kita bisa menggunakan Observer untuk menyimpan riwayat penyewaan secara otomatis. php artisan make:observer PenyewaanObserver --model=Penyewaan namespace App\\\\Observers; use App\\\\Models\\\\Penyewaan; use App\\\\Models\\\\RiwayatPenyewaan; class PenyewaanObserver { public function created(Penyewaan $penyewaan) { RiwayatPenyewaan::create([ 'penyewaan_id' => $penyewaan->id, 'rumah_id' => $penyewaan->rumah_id, 'penyewa_id' => $penyewaan->penyewa_id, 'tanggal_mulai' => $penyewaan->tanggal_mulai, 'tanggal_selesai' => $penyewaan->tanggal_selesai, 'status' => 'Penyewaan baru' ]); } } Daftarkan observer ini di AppServiceProvider agar dapat dijalankan otomatis. public function boot() { Penyewaan::observe(PenyewaanObserver::class); } 2. Mengirim Notifikasi Email Ketika Penyewaan Akan Berakhir Observer ini berguna untuk mengirimkan notifikasi kepada penyewa dan pemilik rumah ketika masa penyewaan hampir berakhir. php artisan make:observer PenyewaanObserver --model=Penyewaan namespace App\\\\Observers; use App\\\\Models\\\\Penyewaan; use App\\\\Mail\\\\PenyewaanBerakhir; use Illuminate\\\\Support\\\\Facades\\\\Mail; class PenyewaanObserver { public function updated(Penyewaan $penyewaan) { if ($penyewaan->tanggal_selesai->isToday()) { Mail::to($penyewaan->penyewa->email)->send(new PenyewaanBerakhir($penyewaan)); Mail::to($penyewaan->rumah->pemilik->email)->send(new PenyewaanBerakhir($penyewaan)); } } } Pastikan observer ini terdaftar agar aktif pada saat aplikasi berjalan. public function boot() { Penyewaan::observe(PenyewaanObserver::class); } 3. Menghitung Harga Sewa Diskon Ketika Promo Diberlakukan Observer ini akan menghitung harga sewa rumah secara otomatis ketika ada promo atau diskon yang diberikan. php artisan make:observer PromoObserver --model=Promo namespace App\\\\Observers; use App\\\\Models\\\\Promo; use App\\\\Models\\\\Rumah; class PromoObserver { public function saving(Promo $promo) { $rumah = Rumah::find($promo->rumah_id); if ($promo->diskon > 0) { $rumah->harga_diskon = $rumah->harga_sewa - ($rumah->harga_sewa * $promo->diskon / 100); $rumah->save(); } } } Daftarkan observer ini di AppServiceProvider. public function boot() { Promo::observe(PromoObserver::class); } 4. Menghapus Data Terkait Ketika Rumah Dihapus Observer ini akan secara otomatis menghapus data terkait seperti penyewaan dan riwayat penyewaan ketika rumah dihapus. php artisan make:observer RumahObserver --model=Rumah namespace App\\\\Observers; use App\\\\Models\\\\Rumah; use App\\\\Models\\\\Penyewaan; class RumahObserver { public function deleted(Rumah $rumah) { Penyewaan::where('rumah_id', $rumah->id)->delete(); } } Daftarkan observer ini agar Laravel dapat memprosesnya secara otomatis. public function boot() { Rumah::observe(RumahObserver::class); } 5. Menghitung Pendapatan Total Ketika Penyewaan Baru Ditambahkan Observer ini secara otomatis akan memperbarui pendapatan total untuk setiap rumah ketika ada penyewaan baru yang masuk. php artisan make:observer PenyewaanObserver --model=Penyewaan namespace App\\\\Observers; use App\\\\Models\\\\Penyewaan; use App\\\\Models\\\\Rumah; class PenyewaanObserver { public function created(Penyewaan $penyewaan) { $rumah = Rumah::find($penyewaan->rumah_id); $rumah->total_pendapatan += $penyewaan->harga; $rumah->save(); } } Pastikan observer ini terdaftar pada AppServiceProvider. public function boot() { Penyewaan::observe(PenyewaanObserver::class); } Dengan menggunakan Observer, kita dapat memastikan bahwa setiap event yang terjadi pada model ditangani secara konsisten tanpa perlu menulis kode berulang di banyak tempat. Ini sangat berguna untuk proyek website sewa rumah yang melibatkan banyak transaksi dan data penting. Penerapan Observer yang tepat akan membuat proyek Anda lebih mudah dikembangkan dan dipelihara. Penutup Laravel akan terus populer berkat update-update terbaru yang memudahkan developer dalam membangun aplikasi web. Setiap versi baru selalu menghadirkan fitur-fitur canggih yang membuat Laravel tetap relevan dan kuat. Untuk Anda yang ingin terus mengikuti perkembangan Laravel dan belajar lebih dalam, pastikan untuk selalu mengunjungi BuildWithAngga. Mereka sering menyediakan kelas gratis dengan studi kasus menarik yang diajarkan langsung oleh mentor berpengalaman. Dengan akses kelas seumur hidup, Anda bisa belajar kapan saja sesuai kebutuhan. Jangan lewatkan kesempatan untuk terus meningkatkan skill programming Anda bersama BuildWithAngga!