Tutorial Laravel 5.8 — Event dengan Automatic Discovery
Bermain dengan fungsi Event di Laravel, buat MVC menjadi less code!
Tutorial Laravel 5.8 — Event dengan Automatic Discovery
Bermain dengan fungsi Event di Laravel, buat MVC menjadi less code!
Halo semua, pada kesempatan kali ini gue mau berbagi insight tentang Laravel Event.
Tutorial ini ditujukan bagi level intermediate, kalau kamu newbie dan baru belajar Laravel, apabila anda bingung dengan isi artikel maka kebingungan ditanggung pemenang. Mungkin bagi yang make Laravel udah advanced ngga akan asing sama fitur Event. Nah bagi yang baru pake laravel kemarin sore (hihihi) mungkin akan asing sama fitur event. Nah gue kasitau dulu deh apa itu menurut docs-nya Laravel.
Laravel’s events provide asimple observer implementation, allowing you to subscribe and listen for various events that occur in your application. Event classes are typically stored in theapp/Eventsdirectory, while their listeners are stored inapp/Listeners. Don’t worry if you don’t see these directories in your application, since they will be created for you as you generate events and listeners using Artisan console commands. Baca ngga kalimat yang saya tebelin? Yep, intinya adalah Laravel menyediakan fitur semacam trigger kalau ada suatu aksi berjalan. Sama ibaratkan trigger pada database, bedanya ini ngga on update, on delete dkknya xixixi 😆. Event di Laravel memungkinkan kita mentrigger sebuah event apabila kita telah menjalankan sebuah method di controller. Temen-temen kan tau Laravel itu pattern-nya MVC (Model View Controller). Nah kenapa harus pake event? Oke saya kasih analoginya. Tapi sebelum saya lanjut jangan lupa agan atau kasitau temen agan yang suka belajar ngoding untuk follow, like, komen en sabskreb Medium saya, yuk kita sama-sama buat Medium ini jadi tempat positif berbagi ilmu secara gretong. Kiddy - MediumRead writing from Kiddy on Medium. Which is more difficult, coding or counting? Not both of them, the difficult one is…medium.com Ngga deng saya bercanda aja, sebenernya saya mau kasitau satu hal dulu kalau fungsi ini hanya berjalan di Laravel versi ≥ 5.8.9, kenapa gitu? Jangan tanya saya, saya mah maba alias mahasiswa baru, tanya aja docs Laravel kenapa gitu.
Lalu apa bedanya gan sama versi sebelumnya? Sebenernya yang bikin beda adalah method event discovery-nya gan.
Pada versi sebelum 5.8.9, semua event masih diregistrasi secara manual. Coba bayangkan kalo agan ada 100 evenr? Gempor dah tuh tangan, ntar bukannya ngoding, eh malah rebahan hahaha, siapa tuh? Jelas saya hehe. Pada kasus koding kali ini akan membuat hal sederhana. Yaitu setelah menginput produk kita akan menulis Log singkat. Ya sebenernya kalo dalam kasus nyata sih akan lebih panjang, cuma saja kan ini belajar, jadi jangan minta lebih yak 😝
Tapi sebelumnya mungkin agan-agan masih bingung kenapa harus pake event sih? Oke jadi gini, mungkin kalo cuma nulis Log singkat agan akan membuat seperti ini.
Bener ngga? Tapi coba sekarang agan bayangkan kalo agan harus membuat sejumlah algoritma mulai dari mengirimkan notifikasi berupa email, mungkin juga menulis log offline ke file, lalu merubah data di table transaksi, atau membuat log yang diinput kedalam database, atau harus mengubah berbagai banyak data setelah satu produk dimasukkan.
Bisa dibayangkan akan memakan berapa banyak baris code didalamnya? Mungkin satu method store saja bisa ≥ 80 baris kode. Gimana kalo kita normalisasi codenya? Jadi yang agan buat cukup berdasarkan event atau kejadian saja, misalnya event setelah produk dibuat dan setelah user melakukan pendaftaran tentu saja berbeda kan? Inilah gunanya event! > Pada tutorial ini saya menggunakan Laravel 6.0. Kalau kalian menggunakan 5.8 ngga apa, pastiin aja pokoknya versi Laravel kalian ≥ 5.8.9.
Oke sekarang karena udah tau kegunaannya, silahkan buat projek baru aja, atau kalo mau make projek yang udah ada pastiin Laravel versinya ≥ 5.8.9 ya!
Bagi yang menggunakan projek lama dan malas mengikuti dasarnya ya di skip aja dulu sampai saya kasitau untuk lanjut ya. Sekarang saya sarankan membuat model sederhana bernama Product.
php artisan make:model Product -m
Nah kalo sudah kan akan muncul tuh migration baru, isi saja seperti ini.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->text('description')->nullable();
$table->integer('stock');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
}
Udah? Jalanin migration dulu.
php artisan migrate
Udah? Oke sekarang kita buat controllernya
php artisan make:controller ProductController --resource
``` Oke di skip aja dulu isi controllernya, bagi yang tadi menggunakan projek lama silahkan mulai ikuti bagian ini.
Kita akan membuat event-nya terlebih dahulu, event yang dibuat adalah event ketika sebuah produk telah dimasukkan kedalam database.
php artisan make:event ProductWasCreated
Sekarang cekApp/Eventsmaka akan ada satu event disana yaitu ProductWasCreated. Isi bagian constructor seperti kode saya dibawah ini.
product = $product;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
```
Kita akan memasukkan model Product sebagai constructor, jadi setiap event ini dipanggil, kita wajib memasukkan object model Product sebagai constructor.
```
php artisan make:listener SendToLog
```
Sekarang kamu cek di App/Listeners bakalan ada SendToLog.php, nah sekarang buat folder didalam Listeners itu dengan namaProductWasCreateddan pindahkanSendToLog.phpkedalam folder tersebut sehingga strukturnya menjadi seperti ini.

Sekarang buka SendToLog.php dan ikuti kode saya dibawah ini:
```
product;
Log::info("Product was Created, product name: $product->name");
}
}
```
Nah sekarang kita udah buat Listenernya, sekarang kita masuk keApp/Providers/EventServiceProviderdan liat kodenya.
Disana kamu akan menemukan satu method, yaitu boot. Boot adalah method yang digunakan untuk mendaftarkan event, sedangkan variable $listen digunakan untuk mapping seperti yang kita lakukan saat ini, bedanya itu manual dan kita otomatis.
Nah sekarang kita baca di Laravel Docs.
> Instead of registering events and listeners manually in the$listenarray of theEventServiceProvider, you can enable automatic event discovery. When event discovery is enabled, Laravel will automatically find and register your events and listeners by scanning your application'sListenersdirectory. In addition, any explicitly defined events listed in theEventServiceProviderwill still be registered.
Kata Laravel: Daripada daftarin event dan listenernya manual pada $listen dan array EventServiceProvider, lu bisa bikin otomatis pencarian event kok. Kalo pencarian event otomatis ini dinyalain, Laravle bakalan otomatis nyariin dan daftarin event dan listener dengan membaca folder Listener. Kalo ada tambahan, event yang didefinisikan secara terpisah di EventServiceProvider bakalan tetep didaftarin kok.
Enak banget ya Laravel Zaman Now? Ngga kaya dulu pas saya nulis 5.4 masih banyak manual xixixixi.
Sekarang tambahin kode ini dipangil bawah EventServiceProvider.
```
/**
* Determine if events and listeners should be automatically discovered.
*
* @return bool
*/
public function shouldDiscoverEvents()
{
return true;
}
```
Ntar jadinya gini ya.
 Sekarang buat dulu views baru bernama create.php dan ikuti kode dibawah.
```