کتابخانه jquery
همه چیز درباره jquery
همه چیز درباره jquery
لاراول : این قابلیت باعث میشود بتوانید در زمان وقوع اتفاقی در سمت سرور اعلانهایی به سمت کلاینت ارسال کنید.
در این مطلب قصد داریم از کتابخانه شخص ثالث Pusher برای ارسال اعلانها به سمت کلاینت بهره بگیریم.
اگر تاکنون با موقعیتی مواجه شدهاید که در زمان وقوع اتفاقی در سمت سرور میبایست اعلانهایی از سمت سرور
به کلاینت ارسال میکردید، در واقع نیازمند استفاده از سازوکار انتشار لاراول (Laravel Broadcasting) بودهاید.
این یک کاربرد مناسب برای بررسی مفهوم انتشار لاراول است و از این رو در این مقاله اقدام به پیادهسازی آن خواهیم کرد.
اگر کنجکاو هستید که سرور چگونه میتواند اعلانهایی را به کلاینت ارسال کند،
باید بگوییم که لاراول به این منظور در پسزمینه از سوکتها استفاده میکند.
ما در ادامه این مقاله همه این مراحل را به صورت گام به گام با کمک همدیگر طی خواهیم کرد.
لاراول به صورت پیشفرض در هسته خود از آداپترهای چندگانه انتشار پشتیبانی میکند.
در این مقاله، قصد داریم از آداپتر انتشار Pusher استفاده کنیم.
برای مقاصد دیباگ کردن میتوانید از آداپتر log نیز استفاده کنید.
اما توجه داشته باشید که در صورت استفاده از آداپتر log، کلاینت دیگر نمیتواند اعلانهای رویداد را دریافت کند،
چون همه آنها در فایل laravel.log ثبت میشوند.
در بخش بعدی مستقیماً وارد مراحل پیادهسازی عملی کاربردهایی خواهیم شد که در بخش قبل مورد اشاره قرار دادیم.
در فرایند انتشار یا broadcasting انواع مختلفی از کانالها وجود دارند که شامل کانالهای عمومی،
خصوصی و presence میشوند. زمانی که یک رویداد به صوت عمومی انتشار مییابد، میبایست
از کانال عمومی استفاده کرد. به طور عکس کانال خصوصی زمانی مورد استفاده قرار میگیرد که
بخواهیم اعلانهای رویداد به برخی کانالهای خصوصی معین محدود شوند.
در زمینه مثالی که ما مورد بررسی قرار میدهیم، قصدمان این است که هر زمان کاربران پیام جدیدی دریافت کردند،
یک اعلان به آنها ارسال شود. برای این که یک کاربر شرایط دریافت اعلانهای انتشار را داشته باشد،
باید وارد حساب خود شده باشد. از این رو باید از کانال خصوصی در این مثال استفاده کنیم.
قبل از هر چیز، باید سیستم احراز هویت پیشفرض لاراول را فعال کنیم تا قابلیتهایی مانند ثبت نام،
ورود به حساب و موارد مشابه به صورت آماده در اختیار ما قرار بگیرند. اگر در این خصوص دچار ابهاماتی هستید
بهتر است به مستندات رسمی (+) این بخش مراجعه کنید.
از آنجا که ما قصد داریم از سرویس شخص ثالث Pusher به عنوان سرور وب سوکت خود استفاده کنیم،
باید یک حساب کاربری در این سرویس (+) ایجاد کنید و مطمئن شوید که اطلاعات احراز هویت API را پس از ثبت نام به دست آوردهاید.
سپس باید SDK مربوط به Pusher را برای PHP نصب کنیم تا اپلیکیشن لاراول ما بتواند اعلانهایی
به سرور وب سوکت Pusher ارسال کند. در ریشه اپلیکیشن لاراول دستور زیر را اجرا کنید تا به صورت یک پکیج کامپوزر نصب شود:
همان طور که میبینید، ما درایور انتشار پیشفرض را به Pusher تغییر دادهایم.
همچنین گزینههای پیکربندی کلاستر و رمزنگاری را نیز که در ابتدا از حساب Pusher دریافت کرده بودیم،
اضافه کردهایم. ضمناً برخی مقادیر را نیز از «متغیرهای محیطی» (environment variables) به دست میآوریم.
تا به اینجا ما موفق شدهایم کتابخانههای مربوط به سرور را نصب کنیم.
در بخش بعدی قصد داریم کتابخانههای کلاینت مورد نیاز را نیز نصب کنیم.
بنابراین باید مطمئن شویم که متغیرهای زیر را در فایل env. به طرز صحیحی تنظیم کردهایم.
در فرایند انتشار، مسئولیت سمت کلاینت این است که در کانالها ثبت نام کند و منتظر شنیدن رویدادهای مورد نظر باشد.
این کار در پسزمینه با باز کردن یک اتصال جدید به سرور وب سوکت صورت میپذیرد.
خوشبختانه نیاز نیست هیچ گونه کتابخانه پیچیده جاوا اسکریپت را نصب کنیم،
چون لاراول از قبل یک کتابخانه کلاینت مفید در این زمینه دارد. Laravel Echo کتابخانه سمت کلاینت لاراول است
که امکان کار کردن با سوکتها را در اختیار ما قرار میدهد.
ضمناً این کتابخانه از سرویس Pusher که در این مقاله مورد استفاده قرار میدهیم نیز پشتیبانی میکند.
شما میتوانید Laravel Echo را با استفاده از ابزار مدیریت بسته NPM نصب کنید.
البته اگر node و npm را روی سیستم خود نصب ندارید، ابتدا باید آنها را نصب کنید.
بقیه کار کاملاً آسان است و در دستور زیر مشخص شده است:
اگر به خاطر داشته باشید در ابتدا گفتیم که قصد داریم اپلیکیشنی بسازیم که به کاربران امکان ارسال پیام
به همدیگر را میدهد. از سوی دیگر اعلانهایی به کاربرانی که وارد حساب خود شدهاند، ارسال میکنیم
تا آنها را از دریافت پیام جدید از سوی کاربران دیگر مطلع سازیم.
در این بخش فایلهایی را که برای پیادهسازی این موارد لازم هستند ایجاد میکنیم.
در آغاز کار یک مدل Message ایجاد میکنیم که پیامهای ارسالی از سوی کاربران به همدیگر را نگهداری میکند.
برای افزودن متن مورد نظرتان اینجا کلیک کنید
نکته مهمی که باید توجه داشته باشید این است که کلاس NewMessageNotification
اینترفیس ShouldBroadcastNow را پیادهسازی میکند. از این رو زمانی که یک رویداد رخ میدهد،
لاراول میداند که این رویداد باید انتشار یابد.
در واقع، میتوان یک اینترفیس ShouldBroadcast را نیز پیادهسازی کرد و لاراول رویداد را به صف رویدادها اضافه میکند.
این رویداد زمانی که نوبتش شود، از سوی ورکر صف رویداد پردازش میشود. در مورد مثال خودمان،
در این مثال، ما میخواهیم اعلانی به کاربر نمایش داده شود که به اطلاع وی میرساند پیامی دریافت کرده است
و از این رو مدل Message در آرگومان سازنده ارسال میشود. بدین ترتیب دادهها به همراه رویداد ارسال میشوند.
سپس یک متد broadcastOn وجود دارد که نام کانالی را تعریف میکند که رویداد در آن منتشر خواهد شد.
در مورد مثال خودمان از یک کانال خصوصی استفاده شده است،
زیرا میخواهیم انتشار رویداد به کاربرانی که وارد حساب کاربری خودشان شدهاند محدود باشد.
متغیر this->message->to$ به ID کاربری اشاره میکند که قرار است رویداد برای وی انتشار یابد.
بدین ترتیب بهتر است که نام کانال چیزی مانند {user.{USER_ID باشد.
احراز هویت کند. بدین ترتیب اطمینان پیدا میکنیم که رویدادهایی که روی کانال خصوصی منتشر میشوند
صرفاً به کلاینتهای احراز هویت شده ارسال میشوند. در مثال مورد بررسی، این بدان معنی است
که تنها کاربرانی که وارد حساب کاربری خود شدهاند، خواهند توانست در کانال {user.{USER_ID ثبت نام کنند.
در این بخش فایلهایی را که برای تست پیادهسازی ما ضروری هستند ایجاد میکنیم.
ابتدا یک فایل کنترلر را در مسیر app/Http/Controllers/MessageController.php با محتوای زیر ایجاد میکنیم:
در متد index ما از ویوی broadcast استفاده میکنیم و از این رو فایل ویوی resources/views/broadcast.blade.php را نیز ایجاد میکنیم:
البته باید مسیرها را در فایل routes/web.php نیز اضافه کنیم:
1
2
|
Route::get(‘message/index’, ‘MessageController@index’);
Route::get(‘message/send’, ‘MessageController@send’);
|
در متد سازنده کلاس کنترلر میتوانید ببینید که از میانافزار auth استفاده کردهایم تا مطمئن شویم
که متدهای کنترلر به کاربران لاگین کرده دسترسی دارند. سپس متد index برای
رندر کردن ویوی broadcast استفاده میشود. در ادامه مهمترین بخش کد را در فایل ویو مینویسیم:
را بارگذاری میکنیم. این کتابخانهها به ما امکان میدهند که یک اتصال وب سوکت با سرور وب
سوکت Pusher برقرار سازیم. سپس با ارائه اطلاعات ضروری دیگر مرتبط با Pusher، وهلهای از Echo را به عنوان آداپتر انتشار خود میسازیم.
در ادامه از متد خصوصی Echo برای ثبت نام در کانال خصوصی {user.{USER_ID استفاده میکنیم.
همان طور که قبلاً گفتیم، کلاینت پیش از ثبت نام در کانال خصوصی، باید هویت خود را احراز کند.
از این رو شیء Echo مراحل مورد نیاز احراز هویت را با ارسال XHR در پسزمینه با پارامترهای
ضروری انجام میدهد. در نهایت لاراول تلاش میکند که مسیر {user.{USER_ID را بیابد و
اگر همه چیز به خوبی پیش برود، باید یک اتصال وب سوکت با سرور وب سوکت Pusher باز شود
و رویدادهای روی کانال {user.{USER_ID از این پس در آن فهرست شوند.
بدین ترتیب قادر خواهیم بود همه رویدادهای ورودی را در این کانال دریافت کنیم.
در مورد مثال خودمان میخواهیم به رویداد NewMessageNotification گوش کنیم
و از این رو از متد listen شیء Echo برای دستیابی به آن استفاده میکنیم.
برای این که همه چیز ساده بماند، تنها در مورد پیامهایی هشدار میدهیم که از سوی سرور
Pusher دریافت شده باشند. بنابراین اکنون همه چیز را برای دریافت رویدادها از سرور وب سوکت تنظیم کردهایم
در ادامه از طریق متد send در فایل کنترلر برخی رویدادهای انتشار را ایجاد میکنیم. کد متد send به صورت زیر است:
به آنها هشداری بدهیم. بنابراین تلاش میکنیم که این رفتار را در متد send شبیهسازی کنیم.
در این زمان، از تابع کمکی event برای ایجاد یک رویداد NewMessageNotification استفاده میکنیم.
از آنجا که رویداد NewMessageNotification از نوع ShouldBroadcastNow است، لاراول پیکربندی
پیشفرض انتشار را از فایل config/broadcasting.php بارگذاری میکند. در نهایت لاراول رویداد
NewMessageNotification را به سرور وب سوکت پیکربندی شده روی کانال انتشار میدهد.
در این مثال، رویداد به سرور وب سوکت Pusher روی کانال {user.{USER_ID انتشارمی یابد.
اگر ID کاربر پذیرنده 1 باشد، این رویداد روی کانال user.1 انتشار پیدا میکند.
بنابراین میتوانیم این رویداد را دریافت کنیم و کادر هشدار برای کاربر مربوطه نمایش پیدا میکند.
در ادامه مراحل مورد نیاز برای تست این مثال کاربردی که ساختهایم را مورد بررسی قرار میدهیم. در مرورگر خود به آدرس زیر بروید:
http://your-laravel-site-domain/message/index
اگر هنوز وارد نشدهاید، به صفحه لاگین هدایت خواهید شد و زمانی که وارد حساب کاربری خود شدید،
ویوی broadcast را میبینید که قبلاً تعریف کردهایم و تاکنون کاربردی نداشته است. در واقع لاراول
سوی کتابخانه کلاینت Pusher را فعال کردهایم، این کتابخانه همه موارد را در کنسول مرورگر به منظور دیباگ کردن،
لاگ میکند. با مراجعه به صفحه http://your-laravel-site-domain/message/index بررسی میکنیم که چه مواردی برای ما لاگ شدهاند:
همان طور که می بینید یک اتصال وب سوکت با سرور وب سوکت Pusher باز شده است
و برای شنیدن رویدادها روی کانال خصوصی ثبت نام صورت گرفته است. البته شما میتوانید
در مثال خودتان بر مبنای ID کاربری که گزارش را تهیه کرده است، نام کانال متفاوتی داشته باشید.
اینک این صفحه را بار نگه میداریم و به متد send میرویم تا تست کنیم.
1
|
http://your-laravel-site-domain/message/send
|
اگر قصد دارید از مرورگر متفاوتی استفاده کنید، باید دوباره وارد حساب کاربری خود شود تا
به این صفحه دسترسی داشته باشید. به محض این که آدرس فوق را باز کنید، میتوانید
یک پیام هشدار را در برگه دیگر با آدرس http://your-laravel-site-domain/message/index ملاحظه کنید.
اینک به کنسول میرویم تا ببینیم چه اتفاقی رخ داده است:
همان طور که میبینید این پیام لاگ نشان میدهد که رویداد App\Events\NewMessageNotification
از سوی سرور وب سوکت Pusher روی کانال private-user.2 دریافت شده است.
در واقع شما میتوانید اتفاقاتی را که رخ داده است در حساب Pusher خود نیز ببینید. به این منظور
به حساب کاربری Pusher خود بروید و به بخش application مراجعه کنید.
زیر بخش Debug Console میتوانید پیامهایی را که لاگ شدهاند ببینید:
در این مقاله با یکی از قابلیتهای لاراول آشنا شدیم که کمتر مورد بررسی قرار گرفته است
و آن قابلیت انتشار لاراول است. این قابلیت به ما امکان میدهد که اعلانهای آنی را با استفاده
از وب سوکتها ارسال کنیم. در طی این مقاله ما یک مثال واقعی برای نمایش مفاهیم فوق ساختیم.
از زبان مشتریان