
تم إعداد ترجمة المقال لطلاب الدورة المهنية "Framework Laravel"
عمل Frek Van der Herten وفريق Spatie بجد لفترة طويلة على Laravel Event Projector ، حزمة تسمح باستخدام مفهوم Sourcing Event في إطار Laravel. وأخيرًا ، يتوفر الإصدار الأول الثابت (الإصدار 1.0.0)!
يمكنك تثبيت Event Projector في مشروعك باستخدام الملحن ، وبفضل اكتشاف الحزمة تلقائيًا في Laravel ، يمكنك العمل فورًا بعد نشر عمليات ترحيل الحزمة وتكوينها!
composer require spatie/laravel-event-projector:^1.0.0
يتطلب Event Projector PHP 7.2 ، لذلك يجب أن يدعم التطبيق الخاص بك أحدث إصدار من PHP ، على الرغم من أن إطار Laravel نفسه يحتاج إلى إصدار PHP لا يقل عن 7.1.3.
ما هو "جيل الحدث"
في مقال توليد الأحداث ، يوصف هذا المفهوم على النحو التالي:
بدلاً من تخزين الحالة الحالية للبيانات في المجال ، استخدم مستودع الإلحاق فقط فقط لإضافة بيانات لتسجيل تسلسل الإجراءات بالكامل المنجز على هذه البيانات. يعمل التخزين كنظام للسجلات ويمكن استخدامه لتحقيق كائنات المجال. يتيح لنا ذلك تبسيط المهام في مجالات الموضوعات المعقدة ، حيث لا توجد حاجة لمزامنة نموذج البيانات ومجال الموضوع ، مما يؤدي إلى تحسين قابلية التوسع وزيادة الإنتاجية والكفاءة التشغيلية. هذا النهج يضمن اتساق بيانات المعاملات ، ويسمح لك أيضًا بالاحتفاظ بسجل وتاريخ التغيير الكامل ، مما يتيح تنفيذ الإجراءات التعويضية.
أوصي بأن تقرأ المقال بأكمله. يوفر وصفًا ممتازًا لهذا القالب ، ويصوت الاعتبارات الخاصة بالاستخدام السليم ، ويصف المواقف التي قد يكون مفيدًا فيها.
أود أيضًا شرح مفهوم إنشاء الحدث ، والذي تم تقديمه في مقدمة الوثائق الخاصة بـ Event Projector:
توليد الأحداث هو نفسه فيما يتعلق بالبيانات من Git فيما يتعلق بالكود. تخزن معظم التطبيقات حالتها الحالية فقط في قاعدة البيانات. يتم فقد قدر كبير من المعلومات المفيدة - لا تعرف كيف وصل التطبيق إلى هذه الحالة.
مفهوم إنشاء الحدث هو محاولة لحل هذه المشكلة عن طريق حفظ جميع الأحداث التي تحدث في التطبيق الخاص بك. يتم تشكيل حالة التطبيق نتيجة للاستماع إلى هذه الأحداث.
لتسهيل الفهم ، والنظر في مثال صغير من الحياة. تخيل أنك بنك. عملائك لديهم حسابات. الاحتفاظ بالمعلومات فقط حول رصيد الحساب لا يكفي. يجب أن تتذكر أيضا جميع المعاملات. عند استخدام قالب إنشاء الحدث ، لن يكون رصيد الحساب مجرد حقل منفصل في قاعدة البيانات ، ولكن قيمة محسوبة بناءً على معلومات المعاملة المخزنة. هذه مجرد واحدة من المزايا العديدة التي يوفرها مفهوم إنشاء الحدث.
تم تصميم هذه الحزمة لتعريف مستخدمي إطار Laravel بمفهوم إنشاء الحدث وتسهيل استخدامه في الممارسة العملية.
يبدو أن Event Projector يساعد في تبسيط العمل باستخدام نمط إنشاء الحدث. ساعدتني الوثائق أيضًا في معرفة كيفية استخدام هذا النهج كجزء من مفاهيم إطار Laravel الذي أعرفه بالفعل.
أساسيات لارافيل للأحداث
لفهم كيفية عمل إنشاء الحدث في حزمة Event Projector وما هي المكونات المشاركة في هذه العملية ، يجب عليك قراءة قسم إنشاء أول جهاز عرض .
على مستوى عالٍ (سامحني إذا لم أكن صحيحًا تمامًا في تقييمي ، نظرًا لأن توليد الأحداث مفهوم جديد بالنسبة لي) فإن جيل الأحداث باستخدام "عارض الأحداث" يشمل:
- نماذج بليغة
- الأحداث التي تنفذ واجهة ShouldBeStored
- فئات العارض
مثال لفئة نموذج باستخدام الأسلوب الثابت createWithAttributes
، المتوفر في الوثائق:
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 { $attributes['uuid'] = (string) Uuid::uuid4(); event(new AccountCreated($attributes)); 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)); } public static function uuid(string $uuid): ?Account { return static::where('uuid', $uuid)->first(); } }
هنا تحتاج إلى الانتباه إلى الأحداث AccountCreated
و MoneyAdded
و MoneySubtracted
و AccountDeleted
، والتي يتم تشغيلها على التوالي لفتح حساب وإضافة أموال إلى الحساب وسحب أموال من الحساب وحذف الحساب.
فيما يلي مثال لحدث MoneyAdded
(إضافة أموال إلى حساب). تخبر واجهة ShouldBeStored حزمة Event Projector أنه ينبغي حفظ هذا الحدث:
namespace App\Events; use Spatie\EventProjector\ShouldBeStored; class MoneyAdded implements ShouldBeStored { public $accountUuid; public $amount; public function __construct(string $accountUuid, int $amount) { $this->accountUuid = $accountUuid; $this->amount = $amount; } }
وأخيرًا ، مثال جزئي على معالج حدث داخل فئة جهاز العرض لتجديد الأموال في الحساب (نوعي المفضل من الحدث المصرفي):
public function onMoneyAdded(MoneyAdded $event) { $account = Account::uuid($event->accountUuid); $account->balance += $event->amount; $account->save(); }
لربط كل هذا معًا ، فكر في مثال من الوثائق الخاصة بإنشاء حساب جديد وإضافة أموال:
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);
أظن أن الرصيد في حسابات Luke و Leia معبّر عنه في القروض القياسية المجرية ، على الرغم من أنني أشك بشكل عام في أنهم سيجرون هذه العمليات علانية.
انجذبت انتباهي أيضًا إلى الميزة التالية المتمثلة في إنشاء أحداث باستخدام هذه الحزمة ، والمشار إليها في الوثائق:
نقطة مهمة عند العمل مع أجهزة العرض - يمكن إنشاؤها بعد وقوع الأحداث. تخيل أن البنك يريد تلقي تقرير عن متوسط الرصيد في كل حساب. في هذه الحالة ، سيكون إنشاء جهاز عرض جديد وتشغيل جميع الأحداث والحصول على هذه البيانات في النهاية كافياً.
تبدو فكرة إنشاء أجهزة عرض جديدة في نهاية الأحداث واعدة للغاية. اتضح أنه ليس عليك الحصول على جميع البيانات "الصحيحة" مقدمًا ، ولكن يمكنك الوصول إلى النتيجة بشكل متكرر.
بالنسبة للأداء ، وفقًا للوثائق ، فإن الوصول إلى أجهزة العرض "يحدث بسرعة كبيرة".
هل تريد معرفة المزيد؟
للبدء ، أوصي بأن تقرأ وثائق Event Projector وتأكد من تثبيت أحدث إصدار من PHP 7.2. قام فريق Spatie أيضًا بتحميل تطبيق نموذجي على Laravel ، موضحًا إمكانيات حزمة Event Projector.
يمكنك تنزيل التعليمات البرمجية وتمييز المستودع بنجمة ، وكذلك المساهمة في تطوير مشروع Event Projector على GitHub . في وقت كتابة هذا التقرير ، كان لدى Event Event Projector بالفعل 15 مشاركًا ، مما جعل جهودهم ممكنة الإصدار المستقر البالغ 1.0. عمل عظيم ، Spatie! أنا متأكد من أن Event Projector سيكون حزمة رائعة أخرى سيتم تقديرها من قبل مجتمع Laravel.