مؤلفه EventDispatcher

ساخت وبلاگ

مؤلفه EventDispatcher ابزارهایی را فراهم می کند که به مؤلفه های برنامه شما اجازه می دهد با اعزام رویدادها و گوش دادن به آنها با یکدیگر ارتباط برقرار کنند.

معرفی

کد شی گرا برای اطمینان از گسترش کد ، مسیری طولانی را طی کرده است. با ایجاد کلاس هایی که مسئولیت های خوبی دارند ، کد شما انعطاف پذیر تر می شود و یک توسعه دهنده می تواند آنها را با زیر کلاس ها گسترش دهد تا رفتارهای خود را تغییر دهد. اما اگر آنها بخواهند تغییرات را با سایر توسعه دهندگان که زیر کلاسهای خود را نیز ساخته اند به اشتراک بگذارند ، وراث کد دیگر جواب نمی دهد.

نمونه ای از دنیای واقعی را در جایی که می خواهید یک سیستم افزونه برای پروژه خود تهیه کنید ، در نظر بگیرید. یک افزونه باید بتواند روش ها را اضافه کند ، یا قبل یا بعد از اجرای یک روش ، بدون دخالت در سایر افزونه ها ، کاری انجام دهد. این یک مشکل آسان برای حل با وراثت منفرد نیست و حتی اگر میراث متعدد با PHP امکان پذیر باشد ، با اشکالاتی خاص خود همراه است.

مؤلفه Symfony EventDispatcher الگوهای طراحی واسطه ای و ناظر را پیاده سازی می کند تا همه این موارد امکان پذیر شود و پروژه های شما را واقعاً گسترده کند.

از مؤلفه httpkeel مثال بزنید. پس از ایجاد یک شیء پاسخ ، ممکن است مفید باشد که عناصر دیگر در سیستم بتوانند قبل از استفاده از آن ، آن را اصلاح کنند (مثلاً برخی از عناوین حافظه پنهان را اضافه کنید). برای انجام این کار ، هسته Symfony یک رویداد را پرتاب می کند - Keel. Response. در اینجا نحوه عملکرد آن آورده شده است:

  • یک شنونده (شیء PHP) به یک شیء توزیع کننده مرکزی می گوید که می خواهد به رویداد هسته گوش دهد.
  • در بعضی از مواقع ، هسته Symfony به شی اعزام Dispatcher می گوید تا رویداد Keel. Response را ارسال کند ، و با آن یک شیء رویداد عبور می کند که به شیء پاسخ دسترسی دارد.
  • توزیع کننده به همه شنوندگان رویداد هسته اطلاع می دهد (یعنی یک روش را فراخوانی می کند).

نصب و راه اندازی

اگر این مؤلفه را در خارج از یک برنامه Symfony نصب کنید ، باید به پرونده فروشنده/autoLoad. php در کد خود نیاز داشته باشید تا مکانیسم خودکار سازی کلاس ارائه شده توسط Composer را فعال کنید. برای اطلاعات بیشتر این مقاله را بخوانید.

استفاده

در این مقاله نحوه استفاده از ویژگی های EventDispatcher به عنوان یک مؤلفه مستقل در هر برنامه PHP توضیح داده شده است. مقاله رویدادها و شنوندگان رویداد را بخوانید تا در مورد نحوه استفاده از آن در برنامه های Symfony بدانید.

مناسبت ها

هنگامی که یک رویداد اعزام می شود ، با یک نام منحصر به فرد (به عنوان مثال Keel. Response) مشخص می شود ، که ممکن است هر تعداد شنوندگان به آن گوش فرا دهند. یک نمونه رویداد نیز ایجاد شده و به همه شنوندگان منتقل می شود. همانطور که بعداً خواهید دید ، خود شیء رویداد اغلب حاوی داده هایی در مورد اعزام این رویداد است.

نامگذاری کنوانسیون ها

نام رویداد منحصر به فرد می تواند هر رشته ای باشد ، اما به صورت اختیاری از چند کنوانسیون نامگذاری پیروی می کند:

  • فقط از حروف کوچک ، اعداد ، نقاط (.) و موارد زیر (_) استفاده کنید.
  • نام پیشوند با یک فضای نام و به دنبال آن یک نقطه (به عنوان مثال سفارش.* ، کاربر.*) ؛
  • نامهای پایان با فعل که نشان می دهد چه اقدامی انجام شده است (به عنوان مثال سفارش. قرار گرفته).

نام رویداد و اشیاء رویداد

هنگامی که توزیع کننده به شنوندگان اطلاع می دهد ، یک شیء رویداد واقعی را به آن شنوندگان منتقل می کند. کلاس رویداد پایه شامل روشی برای متوقف کردن انتشار رویداد است ، اما چیز دیگری نیست.

برای اطلاعات بیشتر در مورد این شیء رویداد پایه ، "شیء رویداد عمومی" را بخوانید.

اغلب اوقات ، داده های مربوط به یک رویداد خاص باید به همراه شیء رویداد منتقل شوند تا شنوندگان اطلاعات لازم را داشته باشند. در چنین حالتی ، یک زیر کلاس ویژه که روش های دیگری برای بازیابی و اصلی اطلاعات دارد می توان هنگام اعزام یک رویداد تصویب کرد. به عنوان مثال ، رویداد Keel. Response از یک پاسخ دهنده استفاده می کند ، که حاوی روش هایی برای دریافت و حتی جایگزین کردن شیء پاسخ است.

توزیع کننده

توزیع کننده هدف اصلی سیستم توزیع کننده رویداد است. به طور کلی ، یک توزیع کننده واحد ایجاد می شود که ثبت نام شنوندگان را حفظ می کند. هنگامی که یک رویداد از طریق توزیع کننده ارسال می شود ، به همه شنوندگان ثبت شده در آن رویداد اطلاع می دهد:

اتصال شنوندگان

برای استفاده از یک رویداد موجود ، باید یک شنونده را به دیسپچر وصل کنید تا در هنگام اعزام این رویداد به آن اطلاع دهید. تماس با روش افزودنی Dispatcher () هرگونه PHP معتبر را به یک رویداد مرتبط می کند:

روش AddListener () تا سه آرگومان طول می کشد:

  1. نام رویداد (رشته) که این شنونده می خواهد به آن گوش کند.
  2. یک تماس با PHP که هنگام اعزام رویداد مشخص شده اجرا می شود.
  3. اولویت اختیاری ، به عنوان یک عدد صحیح مثبت یا منفی تعریف شده است (پیش فرض 0). هرچه عدد بالاتر باشد ، زودتر شنونده خوانده می شود. اگر دو شنونده اولویت یکسان داشته باشند ، آنها به این ترتیب اعدام می شوند که به توزیع کننده اضافه شده اند.

PHP Callable یک متغیر PHP است که می تواند توسط تابع Call_user_Func () استفاده شود و هنگام انتقال به عملکرد IS_CALLABLE () درست باز می گردد. این می تواند یک نمونه بسته باشد ، یک شیء که یک روش __invoke () را اجرا می کند (این همان چیزی است که در واقع تعطیلی است) ، یک رشته که یک تابع یا آرایه ای را نشان می دهد که یک روش شیء یا یک روش کلاس را نشان می دهد.

تا کنون ، شما دیده اید که چگونه اشیاء PHP می توانند به عنوان شنونده ثبت شوند. همچنین می توانید بسته های PHP را به عنوان شنوندگان رویداد ثبت کنید:

پس از ثبت نام شنونده در دیسپچر ، منتظر می ماند تا این رویداد مطلع شود. در مثال بالا ، هنگامی که رویداد Acme. foo. action ارسال می شود ، دیسپچر روش Acmelistener :: Onfoocation () را فراخوانی می کند و شیء رویداد را به عنوان استدلال واحد منتقل می کند:

استدلال رویداد $ شیء رویداد است که هنگام اعزام این رویداد منتقل شد. در بسیاری از موارد ، یک زیر کلاس ویژه با اطلاعات اضافی منتقل می شود. می توانید مستندات یا اجرای هر رویداد را بررسی کنید تا مشخص شود کدام نمونه منتقل شده است.

ثبت نام شنوندگان و مشترکان رویداد در ظرف سرویس

ثبت تعاریف خدمات و برچسب زدن آنها با هسته. event_listener و هسته. شما همچنین باید یک پاس کامپایلر به نام RegisterListenerspass () را در سازنده کانتینر ثبت کنید:

RegisterListEnersPass نام کلاس های متلاطم را حل می کند که به عنوان مثال اجازه می دهد از طریق نام کلاس کاملاً واجد شرایط (FQCN) کلاس رویداد به یک رویداد مراجعه کنید. Pass نقشه برداری Alias را از یک پارامتر اختصاصی کانتینر می خواند. این پارامتر را می توان با ثبت یک پاس دیگر کامپایلر ، addEventaliasespass گسترش داد:

توجه داشته باشید که addEventaliasespass باید قبل از ثبت نام ListEnersPass پردازش شود.

شنوندگان پاس فرض می کنند که شناسه سرویس Dispatcher Event Event_Dispatcher است ، که شنوندگان رویداد با برچسب هسته برچسب خورده اند.

ایجاد و اعزام یک رویداد

علاوه بر ثبت نام شنوندگان در رویدادهای موجود ، می توانید رویدادهای خود را ایجاد و اعزام کنید. این در هنگام ایجاد کتابخانه های شخص ثالث و همچنین هنگامی که می خواهید مؤلفه های مختلف سیستم خود را انعطاف پذیر و جدا کنید ، مفید است.

ایجاد یک کلاس رویداد

فرض کنید می خواهید یک رویداد جدید ایجاد کنید - order. placed - که هر بار که مشتری محصولی را با برنامه شما سفارش می دهد ارسال می شود. هنگام ارسال این رویداد، یک نمونه رویداد سفارشی را ارسال می کنید که به سفارش ارسال شده دسترسی دارد. با ایجاد این کلاس رویداد سفارشی و مستندسازی آن شروع کنید:

اکنون هر شنونده از طریق متد ()getOrder به ترتیب دسترسی دارد.

اگر نیازی به ارسال اطلاعات اضافی به شنوندگان رویداد ندارید، می توانید از کلاس رویداد پیش فرض نیز استفاده کنید. در چنین شرایطی، می توانید رویداد و نام آن را در یک کلاس StoreEvents عمومی، مشابه کلاس KeelEvents مستند کنید.

رویداد را ارسال کنید

متد dispatch() همه شنوندگان را از رویداد داده شده مطلع می کند. دو آرگومان نیاز دارد: نمونه Event برای ارسال به هر شنونده آن رویداد و نام رویداد برای ارسال:

توجه داشته باشید که شی OrderPlacedEvent ویژه ایجاد شده و به متد dispatch() ارسال می شود. اکنون، هر شنونده رویداد order. placed OrderPlacedEvent را دریافت خواهد کرد.

استفاده از مشترکین رویداد

رایج ترین راه برای گوش دادن به یک رویداد، ثبت شنونده رویداد در توزیع کننده است. این شنونده می تواند به یک یا چند رویداد گوش دهد و هر بار که آن رویدادها ارسال می شوند به او اطلاع داده می شود.

راه دیگر برای گوش دادن به رویدادها از طریق مشترک رویداد است. مشترک رویداد یک کلاس PHP است که می تواند به توزیع کننده دقیقاً بگوید که در کدام رویدادها باید مشترک شود. این رابط رابط EventSubscriberInterface را پیاده سازی می کند که به یک روش ثابت به نام getSubscribedEvents() نیاز دارد. مثال زیر را از مشترکی که در رویدادهای keel. response و order. placed مشترک شده است، در نظر بگیرید:

این بسیار شبیه به یک کلاس شنونده است، با این تفاوت که خود کلاس می تواند به توزیع کننده بگوید که باید به کدام رویدادها گوش دهد. برای ثبت مشترک در دیسپچر، از متد addSubscriber() استفاده کنید:

توزیع کننده به طور خودکار مشترک را برای هر رویدادی که توسط متد ()getSubscribedEvents برگردانده می شود، ثبت می کند. این متد آرایه ای را برمی گرداند که با نام های رویداد فهرست بندی شده اند و مقادیر آن یا نام متد برای فراخوانی است یا آرایه ای متشکل از نام متد برای فراخوانی و اولویت (یک عدد صحیح مثبت یا منفی که پیش فرض 0 است).

مثال بالا نحوه ثبت چندین روش شنونده را برای همان رویداد در مشترکین نشان می دهد و همچنین نحوه عبور از اولویت هر روش شنونده را نشان می دهد. هرچه عدد بالاتر باشد ، زودتر روش خوانده می شود. در مثال بالا ، هنگامی که رویداد Keel. Response ایجاد می شود ، روش های OnkeelResponsePre () و OnkeelResponsePost () به این ترتیب خوانده می شوند.

توقف جریان/انتشار رویداد

در بعضی موارد ، ممکن است یک شنونده برای جلوگیری از تماس شنوندگان دیگر معقول باشد. به عبارت دیگر ، شنونده باید بتواند به توزیع کننده بگوید تا تمام انتشار این رویداد را برای شنوندگان آینده متوقف کند (یعنی برای عدم اطلاع شنوندگان دیگر). این می تواند از داخل شنونده از طریق روش StopPropagation () انجام شود:

اکنون ، هر شنونده ای به سفارش. مستقر که هنوز فراخوانی نشده است ، فراخوانی نمی شود.

می توان تشخیص داد که آیا یک رویداد با استفاده از روش IsPropagationStopped () متوقف شده است که یک مقدار بولی را برمی گرداند:

EventDispatcher رویدادها و شنوندگان آگاه

EventDispatcher همیشه از رویداد اعزام شده ، نام این رویداد و اشاره ای به خود به شنوندگان عبور می کند. این می تواند به برخی از برنامه های پیشرفته EventDispatcher منجر شود از جمله اعزام سایر رویدادها در داخل شنوندگان ، زنجیر کردن رویدادها یا حتی شنوندگان بارگیری تنبل به شی Dispatcher.

نام رویدادها

نمونه EventDispatcher و همچنین نام این رویداد که اعزام می شود ، به عنوان استدلال برای شنونده منتقل می شود:

سایر اعزام کنندگان

علاوه بر این که معمولاً از EventDispatcher استفاده می شود ، این مؤلفه با برخی دیگر از توزیع کنندگان ارائه می شود:

فارکس کاران ایران...
ما را در سایت فارکس کاران ایران دنبال می کنید

برچسب : نویسنده : ناهید طباطبایی بازدید : <-PostHit-> تاريخ : جمعه 26 خرداد 1402 ساعت: 22:11