Proyektor Acara Laravel dan Konsep Pembuatan Acara


Terjemahan artikel disiapkan untuk siswa dari kursus profesional "Kerangka Laravel"




Frek Van der Herten dan tim Spatie telah bekerja keras untuk waktu yang lama pada Laravel Event Projector, sebuah paket yang memungkinkan konsep Event Sourcing untuk digunakan dalam kerangka Laravel. Dan akhirnya, versi stabil pertama (v1.0.0) tersedia!


Anda dapat menginstal Proyektor Peristiwa ke dalam proyek Anda menggunakan komposer dan, berkat deteksi paket otomatis di Laravel, mulai bekerja segera setelah menerbitkan paket migrasi dan konfigurasi!


composer require spatie/laravel-event-projector:^1.0.0 

Proyektor Peristiwa membutuhkan PHP 7.2, sehingga aplikasi Anda harus mendukung versi PHP terbaru, meskipun kerangka Laravel sendiri membutuhkan versi PHP setidaknya 7.1.3.


Apa itu "generasi acara"


Dalam artikel Menghasilkan Acara, konsep ini dijelaskan sebagai berikut:


Alih-alih menyimpan keadaan data saat ini di domain, gunakan untuk merekam seluruh urutan tindakan yang dilakukan pada data ini, penyimpanan yang beroperasi dalam mode hanya-append hanya menambah data. Penyimpanan bertindak sebagai sistem catatan dan dapat digunakan untuk mewujudkan objek domain. Ini memungkinkan kami untuk menyederhanakan tugas-tugas dalam area subjek yang kompleks, karena tidak perlu menyinkronkan model data dan area subjek, yang mengarah pada peningkatan skalabilitas, peningkatan produktivitas, dan efisiensi operasional. Pendekatan ini memastikan konsistensi data transaksional, dan juga memungkinkan Anda untuk menyimpan log perubahan dan riwayat lengkap, sehingga memungkinkan untuk melakukan tindakan kompensasi.

Saya sarankan Anda membaca seluruh artikel. Ini memberikan deskripsi yang sangat baik dari template ini, pertimbangan suara untuk penggunaan yang tepat, dan menjelaskan situasi di mana mungkin berguna.


Saya juga menyukai penjelasan konsep pembuatan acara, yang diberikan dalam pengantar dokumentasi untuk Proyektor Acara:


Generasi peristiwa sama dengan yang terkait dengan data daripada Git terkait dengan kode. Sebagian besar aplikasi hanya menyimpan statusnya saat ini dalam database. Sejumlah besar informasi bermanfaat hilang - Anda tidak tahu bagaimana aplikasi mencapai kondisi ini.

Konsep pembuatan acara adalah upaya untuk menyelesaikan masalah ini dengan menyimpan semua peristiwa yang terjadi di aplikasi Anda. Keadaan aplikasi dibentuk sebagai hasil dari mendengarkan acara-acara ini.

Untuk memfasilitasi pemahaman, pertimbangkan contoh kecil dari kehidupan. Bayangkan Anda adalah bank. Pelanggan Anda memiliki akun. Menyimpan informasi tentang saldo akun saja tidak cukup. Anda juga harus mengingat semua transaksi. Saat menggunakan templat pembuatan acara, saldo akun bukan hanya bidang terpisah dalam basis data, tetapi nilai yang dihitung berdasarkan informasi transaksi yang tersimpan. Ini hanyalah salah satu dari banyak manfaat yang ditawarkan oleh konsep generasi acara.

Paket ini dirancang untuk membiasakan pengguna kerangka Laravel dengan konsep pembuatan acara dan memfasilitasi penggunaannya dalam praktik.

Tampaknya Proyektor Acara membantu menyederhanakan pekerjaan dengan pola pembuatan acara. Dokumentasi juga membantu saya mencari cara untuk menggunakan pendekatan ini sebagai bagian dari konsep kerangka Laravel yang sudah saya ketahui.


Dasar-Dasar Peristiwa Laravel


Untuk memahami bagaimana pembuatan acara dalam paket Proyektor Acara bekerja dan komponen apa yang terlibat dalam proses ini, Anda harus membaca bagian Membuat bagian proyektor pertama .


Pada tingkat tinggi (maafkan saya jika saya tidak sepenuhnya benar dalam penilaian saya, karena pembuatan acara adalah konsep baru bagi saya) pembuatan acara menggunakan Proyektor Acara meliputi:


  • Model Mahir
  • Acara yang mengimplementasikan antarmuka ShouldBeStored
  • Kelas Proyektor

Contoh kelas model dengan metode statis createWithAttributes , yang disediakan dalam dokumentasi:


 namespace App; use App\Events\AccountCreated; use App\Events\AccountDeleted; use App\Events\MoneyAdded; use App\Events\MoneySubtracted; use Illuminate\Database\Eloquent\Model; use Ramsey\Uuid\Uuid; class Account extends Model { protected $guarded = []; protected $casts = [ 'broke_mail_send' => 'bool', ]; public static function createWithAttributes(array $attributes): Account { /* *      (uuid). */ $attributes['uuid'] = (string) Uuid::uuid4(); /* *          uuid. */ event(new AccountCreated($attributes)); /* *         uuid. */ return static::uuid($attributes['uuid']); } public function addMoney(int $amount) { event(new MoneyAdded($this->uuid, $amount)); } public function subtractMoney(int $amount) { event(new MoneySubtracted($this->uuid, $amount)); } public function delete() { event(new AccountDeleted($this->uuid)); } /* *         uuid. */ public static function uuid(string $uuid): ?Account { return static::where('uuid', $uuid)->first(); } } 

Di sini Anda perlu memperhatikan peristiwa-peristiwa yang dibuat oleh AccountCreated , MoneyAdded , MoneySubtracted dan AccountDeleted , masing-masing terpicu untuk membuka akun, menambah uang ke akun, menarik uang dari akun dan menghapus akun.


Berikut ini adalah contoh acara MoneyAdded (menambahkan uang ke akun). Antarmuka ShouldBeStored memberi tahu paket Proyektor Acara bahwa acara ini harus disimpan:


 namespace App\Events; use Spatie\EventProjector\ShouldBeStored; class MoneyAdded implements ShouldBeStored { /** @var string */ public $accountUuid; /** @var int */ public $amount; public function __construct(string $accountUuid, int $amount) { $this->accountUuid = $accountUuid; $this->amount = $amount; } } 

Dan akhirnya, sebagian contoh pengendali acara di dalam kelas proyektor untuk mengisi kembali dana di akun (jenis acara perbankan favorit saya):


 public function onMoneyAdded(MoneyAdded $event) { $account = Account::uuid($event->accountUuid); $account->balance += $event->amount; $account->save(); } 

Untuk menghubungkan semua ini bersama-sama, pertimbangkan contoh dari dokumentasi tentang membuat akun baru dan menambahkan dana:


 Account::createWithAttributes(['name' => 'Luke']); Account::createWithAttributes(['name' => 'Leia']); $account = Account::where(['name' => 'Luke'])->first(); $anotherAccount = Account::where(['name' => 'Leia'])->first(); $account->addMoney(1000); $anotherAccount->addMoney(500); $account->subtractMoney(50); 

Saya menduga bahwa saldo dalam rekening Lukas dan Leia dinyatakan dalam pinjaman standar galaksi, meskipun secara umum saya ragu bahwa mereka akan secara terbuka melakukan operasi seperti itu.


Perhatian saya juga tertarik oleh keuntungan berikut menghasilkan acara menggunakan paket ini, yang ditunjukkan dalam dokumentasi:


Suatu hal yang menarik ketika bekerja dengan proyektor - mereka dapat dibuat setelah peristiwa terjadi. Bayangkan bank ingin menerima laporan tentang saldo rata-rata di setiap akun. Dalam hal ini, cukup membuat proyektor baru, memutar semua acara dan mendapatkan data ini pada akhirnya.

Gagasan untuk membuat proyektor baru di akhir acara tampaknya sangat menjanjikan. Ternyata Anda tidak harus mendapatkan semua data yang "benar" sebelumnya, tetapi Anda bisa sampai pada hasil secara iteratif.


Adapun kinerja, menurut dokumentasi, akses ke proyektor "terjadi dengan sangat cepat."


Ingin tahu lebih banyak?


Untuk memulai, saya sarankan Anda membaca dokumentasi Event Projector dan pastikan Anda memiliki versi terbaru PHP 7.2 diinstal. Tim Spatie juga mengunggah aplikasi sampel di Laravel , menunjukkan kemampuan paket Proyektor Acara.


Anda dapat mengunduh kode, menandai repositori dengan tanda bintang, dan juga berkontribusi pada pengembangan proyek Proyektor Acara di GitHub . Pada saat penulisan, Proyektor Acara proyek telah memiliki 15 peserta, yang upayanya memungkinkan rilis stabil 1,0. Kerja bagus, Spatie! Saya yakin Event Projector akan menjadi paket hebat lainnya yang akan dihargai oleh komunitas Laravel.

Source: https://habr.com/ru/post/id460683/


All Articles