Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)
Pada artikel ini, kita akan membahas dasar-dasar manajemen event pada Laravel. Ini adalah salah satu fitur anda yang penting, sebagai seorang developer, seharusnya Anda ada didalam gudang persenjataan yang sesuai dengan Framework yang Anda inginkan. Saat kami melanjutkan, kami juga akan memanfaatkan kesempatan ini untuk menciptakan contoh nyata tentang event dan listener, dan juga itulah tujuan akhir artikel ini.
Konsep event di Laravel didasarkan pada pola perancangan perangkat lunak yang sangat populer - disebut sebagai observer pattern. Dalam pola ini, sistem seharusnya mengumpulkan event saat terjadi sesuatu, dan Anda dapat menentukan listener yang menangkap event itu dan bereaksi sesuai dengan hal tersebut. Ini adalah fitur yang sangat berguna dengan cara yang memungkinkan Anda memisahkan komponen dalam sistem yang seharusnya menghasilkan kode yang digabungkan dengan kuat.
Misalnya, Anda ingin memberi tahu semua modul dalam sistem saat seseorang masuk ke website Anda. Dengan demikian, ini memungkinkan mereka bereaksi terhadap login event ini, entah tentang mengirim email atau pemberitahuan dalam aplikasi atau dalam hal apapun yang ingin bereaksi terhadap event login ini.
Dasar-dasar dari Event and Listener
Pada bagian ini, kita akan mengeksplorasi cara Laravel dalam mengimplementasikan event dan listener dalam core framework. Jika Anda terbiasa dengan arsitektur dari Laravel, Anda mungkin tahu bahwa Laravel menerapkan konsep service provider yang memungkinkan Anda menyisipkan berbagai service ke dalam aplikasi.
Dengan cara yang sama, Laravel menyediakan class EventServiceProvider.php
yang memungkinkan kita untuk mendefinisikan pemetaan terhadap event listener untuk suatu aplikasi.
Lanjutkan dan tarik file app/Providers/EventServiceProvider.php
.
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'App\Events\SomeEvent' => [ 'App\Listeners\EventListener', ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Mari melihat dari dekat properti $listen
, yang memungkinkan Anda menentukan array dari event dan listener yang terkait. Array tersebut adalah sesuai dengan event dalam sebuah sistem, dan nilainya sesuai dengan listener yang akan dipicu saat event yang sesuai dipicu (trigger) dalam sebuah sistem.
Saya lebih memilih untuk mengambil contoh dari dunia nyata untuk mendemonstrasikannya lebih jauh. Seperti yang mungkin Anda ketahui, Laravel menyediakan sistem otentikasi yang sudah tersedia sehingga memfasilitasi fitur seperti login, register, dan sejenisnya.
Kita asumsikan bahwa Anda ingin mengirim notifikasi email, sebagai tindakan pengamanan, saat seseorang masuk ke aplikasi. Jika Laravel tidak mendukung fitur event listener, Anda mungkin telah selesai mengedit core class atau cara lain untuk memasukkan kode Anda yang akan mengirim email.
Sebenarnya, Anda berada di pihak yang lebih beruntung saat Laravel membantu Anda memecahkan masalah ini dengan menggunakan event listener. Mari revisi file app/Providers/EventServiceProvider.php
agar terlihat seperti berikut.
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\SendEmailNotification', ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Illuminate\Auth\Events\Login
adalah event yang akan diajukan oleh plugin Auth
saat seseorang masuk ke aplikasi. Kami telah mengikat event tersebut ke App\Listeners\SendEmailNotification
, jadi akan dipicu pada saat login event.
Tentu saja, Anda perlu menentukan class listener App\Listeners\SendEmailNotification
dalam kondisi pertama. Seperti biasa, Laravel memungkinkan Anda membuat template code listener menggunakan perintah artisan.
php artisan event:generate
Perintah ini menghasilkan class event dan listener yang terdaftar di bawah properti $listen
.
Dalam kasus kami, event Illuminate\Auth\Events\Login
sudah tersedia, jadi hanya menciptakan class listener App\Listeners\SendEmailNotification
. Sebenarnya, itu juga akan menciptakan class event Illuminate\Auth\Events\Login
jika tidak ada di kondisi pertama.
Mari kita lihat class listener yang dibuat di app/Listeners/SendEmailNotification.php
.
<?php namespace App\Listeners; use Illuminate\Auth\Events\Login; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class SendEmailNotification { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param Login $event * @return void */ public function handle(Login $event) { } }
Ini adalah method handle
yang akan dipanggil dengan dependensi yang sesuai setiap kali listener dipicu. Dalam kasus kami, argumen $event
harus berisi informasi kontekstual tentang event login - memasukkan informasi dari pengguna.
Dan kita bisa menggunakan objek $event
untuk melakukan pemrosesan lebih lanjut dalam method handle
. Dalam kasus ini, kami ingin mengirim notifikasi email ke pengguna yang melakukan login.
Method handle
yag direvisi mungkin terlihat seperti:
public function handle(Login $event) { // get logged in user's email and username $email = $event->user->email; $username = $event->user->name; // send email notification about login }
Jadi begitulah seharusnya Anda menggunakan fitur event di Laravel. Dari bagian selanjutnya dan seterusnya, kita akan melanjutkan dan membuat kustomisasi event dan class listener yang terkait.
Membuat Kustomisasi Event
Contoh skenario yang akan kita gunakan untuk contoh adalah seperti ini:
- Aplikasi perlu membersihkan cache dalam sistem pada titik-titik tertentu. Kami akan membangkitkan event
CacheClear
beserta informasi kontekstual saat aplikasi melakukan hal tersebut di atas. Kami akan melewati petunjuk grup cache bersamaan dengan event yang telah dihapus. - Modul lain dalam sistem dapat mengggunakan event listener
CacheClear
dan ingin menerapkan kode yang mempersiapkan cache terkait.
Mari tinjau kembali file app/Providers/EventServiceProvider.php
dan mari kita daftarkan pemetaan event dan listener khusus tersebut.
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'App\Events\ClearCache' => [ 'App\Listeners\WarmUpCache', ], ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Seperti yang Anda lihat, kami telah mendefinisikan event App\Events\ClearCache
dan class listener terkait App\Listeners\WarmUpCache
di bawah properti $listen
.
Selanjutnya, kita perlu membuat class file terkait. Ingat bahwa Anda selalu bisa menggunakan perintah artisan untuk menghasilkan template kode dasar.
php artisan event:generate
Hal tersebut seharusnya membuat class event di app/Events/ClearCache.php
dan class listener di app/Listeners/WarmUpCache.php
.
Dengan beberapa perubahan, class app/Events/ClearCache.php
akan terlihat seperti ini:
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class ClearCache { use Dispatchable, InteractsWithSockets, SerializesModels; public $cache_keys = []; /** * Create a new event instance. * * @return void */ public function __construct(Array $cache_keys) { $this->cache_keys = $cache_keys; } /** * Get the channels the event should broadcast on. * * @return Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }
Seperti yang mungkin Anda perhatikan, kami telah menambahkan properti $cache_keys
yang akan digunakan untuk menyimpan informasi yang akan diteruskan bersama dengan suatu event. Dalam kasus ini, kami akan melewati grup cache yang sama.
Selanjutnya, mari kita lihat class listener dengan method handle
yang diperbarui di app/Listeners/WarmUpCache.php
.
<?php namespace App\Listeners; use App\Events\ClearCache; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class WarmUpCache { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param ClearCache $event * @return void */ public function handle(ClearCache $event) { if (isset($event->cache_keys) && count($event->cache_keys)) { foreach ($event->cache_keys as $cache_key) { // generate cache for this key // warm_up_cache($cache_key) } } } }
Ketika listener dipanggil, method handle
dilewatkan dengan instance dari event terkait. Dalam kasus ini, kami harus menjadi instance dari event ClearCache
yang akan dilewatkan sebagai argumen pertama ke method handle
.
Selanjutnya, itu hanya masalah iterasi melalui setiap cache dan mempersiapkan cache terkait.
Sekarang, kami memiliki segalanya untuk menguji hal-hal yang bertentangan. Mari kita segera membuat file controller di app/Http/Controllers/EventController.php
untuk menunjukkan bagaimana Anda bisa meningkatkan sebuah event.
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Library\Services\Contracts\CustomServiceInterface; use App\Post; use Illuminate\Support\Facades\Gate; use App\Events\ClearCache; class EventController extends Controller { public function index() { // ... // you clear specific caches at this stage $arr_caches = ['categories', 'products']; // want to raise ClearCache event event(new ClearCache($arr_caches)); // ... } }
Pertama, kita telah melewati sebuah array cache sebagai argumen pertama saat membuat sebuah instance dari event ClearCache
.
Fungsi helper event digunakan untuk meningkatkan event dari mana saja dalam aplikasi. Saat event dinaikkan, Laravel memanggil semua listener untuk melakukan proses listener terhadap event tersebut.
Dalam kasus kami, App\Listeners\WarmUpCache
diatur untuk melakukan proses listener terhadap event App\Events\ClearCache
. Dengan demikian, method handle
App\Listeners\WarmUpCache
dipanggil saat event dinaikkan dari controller. Sisanya untuk mempersiapkan cache yang telah dibersihkan!
Jadi itulah bagaimana Anda dapat membuat event khusus dalam aplikasi Anda dan bekerja dengan mereka.
Apa itu Subscriber Event?
Event subscriber memungkinkan Anda untuk menggunakan banyak event listener subscribe dalam satu tempat. Apakah Anda ingin secara logis mengelompokkan event listener atau Anda ingin memuat event yang berkembang dalam satu tempat, ini adalah event subscriber yang Anda cari.
Jika kita telah menerapkan contoh yang dibahas sejauh ini dalam artikel dengan menggunakan event subscriber, mungkin akan terlihat seperti ini.
<?php // app/Listeners/ExampleEventSubscriber.php namespace App\Listeners; class ExampleEventSubscriber { /** * Handle user login events. */ public function sendEmailNotification($event) { // get logged in username $email = $event->user->email; $username = $event->user->name; // send email notification about login... } /** * Handle user logout events. */ public function warmUpCache($event) { if (isset($event->cache_keys) && count($event->cache_keys)) { foreach ($event->cache_keys as $cache_key) { // generate cache for this key // warm_up_cache($cache_key) } } } /** * Register the listeners for the subscriber. * * @param Illuminate\Events\Dispatcher $events */ public function subscribe($events) { $events->listen( 'Illuminate\Auth\Events\Login', 'App\Listeners\[email protected]' ); $events->listen( 'App\Events\ClearCache', 'App\Listeners\[email protected]' ); } }
Ini adalah method subscribe
yang bertanggung jawab untuk mendaftarkan listerner. Argumen pertama dari method subscribe
adalah instance dari class Illuminate\Events\Dispatcher
yang dapat Anda gunakan untuk mengikat event dengan listener menggunakan method listen
.
Argumen pertama dari method listen
adalah event yang ingin Anda gunakan dalam proses listener, dan argumen kedua adalah listener yang akan dipanggil saat event dinaikkan.
Dengan cara ini, Anda dapat menentukan banyak event dan listener di class subscriber itu sendiri.
Event class subscriber tidak akan diambil secara otomatis. Anda perlu mendaftarkannya di clas EventServiceProvider.php
di bawah properti $subscriber
, seperti yang ditunjukkan pada code snippet berikut.
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The subscriber classes to register. * * @var array */ protected $subscribe = [ 'App\Listeners\ExampleEventSubscriber', ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // } }
Jadi itu adalah event class subscriber yang Anda inginkan, dan dengan itu kami juga telah sampai pada akhir artikel ini.
Kesimpulan
Hari ini kita telah membahas beberapa fitur menarik dari event dan listener pada Laravel. Mereka didasarkan pada pegamatan design pattern yang memungkinkan Anda untuk meningkatkan event pada aplikasi secara menyeluruh dan memungkinkan modul lain menggunakan listener tersebut bereaksi sesuai dengan event.
Ingin meningkatkan kecepatan Laravel dan memperluas pengetahuan tentang website, atau aplikasi Anda dengan ekstensi? Kami memiliki berbagai hal yang dapat anda pelajari di Envato Market.
Jangan ragu untuk mengungkapkan pendapat Anda menggunakan kolom komentar di bawah ini!