Event Manager یکی از مباحث کاربردی برنامه نویسی است که جدای از اینکه در زند فریم ورک 2 کاربرد فراوانی دارد در پروژه های برنامه نویسی دیگر نیز میتوان از این الگو و ساختار استفاده کرد تا نرم افزاری بهتر و سالم تر ایجاد کرد. این امکان قابلیتی به نام رویداد ها را به پروژه شما اضافه میکند. رویداد ها در واقع اتفاقاتی هستند که شما آنها را در پروژه تعریف کرده اید. به عنوان مثال :‌ ارسال پیامک – دریافت پیامک – ارسال ایمیل – فراخوانی کلاس خاص – افزودن رکورد در پایگاه داده – حذف رکورد – ورود کاربر – خروج کاربر – تغییر مشخصات کاربر – بروز خطای خاص – ایجاد کاربر جدید – جستجوی پایگاه داده بر روی جدول خاص و …

همه موارد بالا را میتوان به عنوان رویداد در نظر گرفت. دقت کنید که رویداد ها معمولا مبتنی بر یک درخواست هستند. به این معنی که طول عمر رویدادها در همان بازه شروع تا پایان برنامه (به ازای هر درخواست – per request) می باشد. البته در شرایطی هم میتوان از پایگاه داده برای ایجاد رویدادهای مستقل از درخواست نیز استفاده کرد. اما این روش معمول نیست. در مثال هایی که در بالا ذکر شد برخی از رویداد ها در طول اجرا تنها یکبار اتفاق می افتند. مانند ورود یا خروج کاربر. برخی از آنها نیز ممکن است به تعداد زیادی اتفاق بیفتد مانند جستجوی پایگاه داده. از نظر من قبل از انجام پروژه بایستی طراحی رویدادها انجام گیرد. یعنی باید مشخص شود که کدام فعالیت ها در طول پروژه به عنوان رویداد استفاده خواهند شد و چرا؟

فرض کنید می خواهید گزارشی از عملکرد مدیران یک سیستم تهیه نمایید. گزارش شامل این اطلاعات است :‌

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

در حالت عادی بدون استفاده از Event Manager شما بایستی کلاس خاصی را ایجاد نمایید که منحصر به یک ماژول نباشد و درون آن هر متد یکی از اطلاعات یکی از گزارشات را دریافت و در پایگاه داده ثبت نماید. سپس در هر بخش که نیاز دارید یکی از این متد ها را فراخوانی کرده و اطلاعات مربوط به همان متد را ارسال مینمایید.

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

همیشه بزرگترین دغدغه ی ما در کدنویسی باید این باشد که چطور کد مستقل تری بنویسیم؟

خوب مثال بالا اگر بدون Event manager انجام شود وابستگی های زیادی پیش خواهد آمد و این وابستگی ها عملا ماژولار بودن سیستم را زیر سوال میبرد. حال اگر به جای اینکار از ‌Event Manager استفاده کنیم میتوانیم هر یک از موارد بالا را یک رویداد در نظر بگیریم. رویدادهایی مانند event-login یا event-logout یا event-create-db-record و … . حال کافیست به جای فراخوانی متد مربوط به گزارشات, رخ دادن یک رویداد را به برنامه اعلام کنیم. این اعلام وقوع رویداد به خودی خود هیچ کاری برای ما انجام نمیدهد مگر اینکه کلاس هایی داشته باشیم با عنوان Listeners که وظیفه ی آنها گوش دادن به وقوع رویدادهاست. این کلاس ها توسط برنامه نویس نوشته می شوند و مشخص میشود که هر کلاس مربوط به کدام رویداد است و چه وظیفه ای دارد. در این حالت اگر در تمام ماژول ها هم وقوع یک رویداد اعلام شود همواره مستقل بودن ماژول حفظ می شود و میتوان با حذف Listener مربوطه, آن رویداد را ازکار انداخت.(بهتر است خطوط اعلان رویداد ها حذف نشود).

برای ایجاد یک رویداد در زند فریم ورک ۲ حداقل نیاز به یک Listener داریم. قبل از آن بایستی یک کلاس برای مدیریت یک رویداد داشته باشیم‌. فرض میکنیم که میخواهیم رویدادی با نام myEvent را در برنامه استفاده نماییم :‌

با استفاده از متد setIdentifiers یک(یا چند) نام منحصر به فرد به رویداد ما خواهد داد تا در هنگام استفاده از SharedEventManager دچار مشکل نشویم.

برای اطلاع بیشتر از اینکه Shared service ها چه خصوصیت هایی دارند به مطلب تنظیم سرویس ها مراجعه نمایید.

سپس بایستی Listener را معرفی نماییم که میتواند شامل توابع بی نام و یا یک کلاس و یا یک متد باشد :

در نهایت با اجرای کد خط آخر رویداد myEvent رخ میدهد و اجرای برنامه به بخش Listener که همان تابع بی نام هست منتقل می شود.

مثال بالا یک نمونه ساده از نحوه کاربرد رویداد هاست. در زند فریم ورک ۲ امکان attach کردن چند رویداد مختلف به یک Listener وجود دارد:

علاوه بر این پارامتر نام رویداد میتواند شامل Wildcard نیز باشد. با علامت * میتوانید تمام رویداد ها را به یک Listener هدایت کنید.

رویداد های پیش فرضی که در هسته زند فریم ورک ۲ استفاده شده اند شامل موارد زیر است :‌

در بخش Module Manager :

  • Zend\Module\Manager: loadModules.pre
  • For every module:
    • Zend\Module\Manager: loadModule.resolve
    • Zend\Module\Manager: loadModule
  • Zend\Module\Manager: loadModules.post

در بخش Application زمانی که خطایی رخ نداده است به ترتیب رویداد های زیر رخ میدهند :

  • Zend\Mvc\Application: bootstrap
  • Zend\Mvc\Application: route
  • Zend\Mvc\Application: dispatch
    • Zend\Mvc\Controller\ActionController: dispatch (if controller extends this class)
  • Zend\Mvc\Application: render
  • Zend\View\View: renderer
  • Zend\View\View: response
  • Zend\Mvc\Application: finish

و زمانی که خطایی رخ میدهد(تمام خطا ها شامل این موارد نمی شوند) :‌

  • Zend\Mvc\Application: dispatch.error
  • Zend\Mvc\Application: render
  • Zend\View\View: renderer
  • Zend\View\View: response
  • Zend\Mvc\Application: finish

 

events-small

محمد باقر رستمی

برنامه نویسی رو دوست دارم و از کارم و بیشتر از اون از یادگرفتن لذت می برم. دوست دارم از این طریق برای مردم دنیا مفید باشم. فارغ از رنگ، نژاد، ملیت و جنسیت.

Latest posts by محمد باقر رستمی (see all)

facebooktwittergoogle_pluslinkedin

دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

*


هفت − 3 =