<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محسن میرحسینی</title>
        <link>https://virgool.io/feed/@nishtman</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-14 15:23:31</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/71421/avatar/ctD8pe.png?height=120&amp;width=120</url>
            <title>محسن میرحسینی</title>
            <link>https://virgool.io/@nishtman</link>
        </image>

                    <item>
                <title>پیاده‌سازی وب‌سوکت‌ها با لاراول - بخش دوم</title>
                <link>https://virgool.io/@nishtman/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%D8%A8-%D8%B3%D9%88%DA%A9%D8%AA-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-spw92hxaqhrj</link>
                <description>در بخش قبلی به همراه هم تونستیم یک وب‌سوکت‌سرور رو با لاراول راه‌اندازی کنیم. یک کتابخونه نصب کردیم که جایگزین pusher باشه و وظیفه دریافت و ارسال اطلاعات در کانال‌های ارتباطی بین سرور و کلاینت رو برعهده داشته باشه.در این بخش سعی می‌کنیم یک کانال ارتباطی در لاراول ایجاد کنیم و اطلاعات رو در این کانال جریان بدیم و همچنین بوسیله جاوااسکریپت در سمت کلاینت به اون متصل بشیم و اطلاعات موجود در کانال رو دریافت کنیم و به صورت یک نوتیفیکیشن نمایششون بدیم. با من همراه باشید تا وارد مرحله بعدی بشیم.ایجاد یک کانال ارتباطیحتما قبل از این متوجه شدین که داخل دایرکتوری routes در پروژه لاراول یک فایل با عنوان channels.php وجود داره که تا قبل از این استفاده‌ای ازش نکردیم. در لاراول برای تعریف کانال‌های ارتباطی از این فایل استفاده می‌کنیم. اگر کد زیر رو به فایل channels.php اضافه کنید یک کانال با اسم test-channel ایجاد می‌شه که می‌تونیم جریان اطلاعات رو به اون ارسال یا ازش دریافت کنیم.Broadcast::channel(&#039;test-channel&#039;, function () {});در لاراول ارسال جریان اطلاعات درون یک کانال بوسیله eventها انجام می‌شه. پس برای اینکه بتونیم بوسیله وب‌سوکت کاربر رو از اطلاعات خاصی مطلع کنیم باید یک رخداد پیش بیاد. به ‌عنوان مثال در نظر بگیرید که کاربر در فروشگاه اینترنتی شما مشغول مشاهده محصولاته و شما همون موقع تصمیم می‌گیرید قیمت محصولات رو تغییر بدین. برای اینکه کاربر از بروزرسانی این قیمت‌ها باخبر بشه می‌تونیم یک رخداد تعریف کنیم و در کانال ارتباطی که قبلا کاربر بهش متصل‌شده اطلاعاتی در این خصوص ارسال کنیم. می‌تونیم همه قیمت‌ها رو ارسال کنیم یا در روشی که من بهتر می‌دونم، کلاینت رو باخبر کنیم که باید اطلاعات محصولات رو دوباره از سرور فراخوانی کنهپس با استفاده از دستور زیر یک رخداد می‌سازیم و سراغ فایل رخداد می‌ریم تا تنظیمات مربوط رو در اون انجام بدیم.$ php artisan make:event TestWebsocketEventاگر به دایرکتوری app/events مراجعه کنید می‌بینید که یک فایل به‌نام TestWebsocketEvent ایجاد شده که در ادامه محتویات اون رو باهم بررسی می‌کنیم.class TestWebsocketEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    
    /**
     * Create a new event instance.
     */
    public function __construct()
    {
        
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array&lt;int, \Illuminate\Broadcasting\Channel&gt;
     */
    public function broadcastOn(): array
    {
        return [
            new PrivateChannel(&#039;channel-name&#039;),
        ];
    }
}اولین مساله اینکه این کانال‌های ارتباطی که بین سرور و کلاینت ایجاد می‌شن شامل public channels و private channels هستن و بزرگترین تفاوتشون اینه که در کانال‌های خصوصی می‌تونیم کاربر رو اعتبارسنجی کنیم و متوجه بشیم که کدوم کاربر در حال حاضر به کانال متصل شده. ولی اجازه بدین که در بخش‌های بعدی در این‌خصوص صحبت کنیم و در حال حاضر برای استفاده از یک کانال عمومی فایل رخداد ایجاد‌شده رو به شکل زیر تغییر بدینclass TestWebsocketEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public array $data;

    /**
     * Create a new event instance.
     */
    public function __construct()
    {
        $this-&gt;data = [
            &#039;title&#039; =&gt; &#039;New Notification&#039;,
            &#039;message&#039; =&gt; &#039;You have new Notification&#039;,
        ];
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array&lt;int, \Illuminate\Broadcasting\Channel&gt;
     */
    public function broadcastOn(): array
    {
        return [
//            new PrivateChannel(&#039;channel-name&#039;),
            new Channel(&#039;test-channel&#039;)
        ];
    }
}اول از همه یک property به این کلاس اضافه کردیم که حاوی اطلاعتیه که قراره توی کانال جریان پیدا‌کنهpublic array $data;

public function __construct()
{
    $this-&gt;data = [
        &#039;title&#039; =&gt; &#039;New Notification&#039;,
        &#039;message&#039; =&gt; &#039;You have new Notification&#039;,
    ];
}بعد از اون هم بوسیله متد broadcastOn به لاراول می‌گیم که اطلاعات این رخداد روی کدوم کانال(ها) باید جریان داشته باشه و در حال حاضر از یک کانال عمومی استفاده کردیم که در مرحله قبلی درون فایل broadcast.php اون رو ایجاد کرده بودیم.public function broadcastOn(): array
    {
        return [
//            new PrivateChannel(&#039;channel-name&#039;),
            new Channel(&#039;test-channel&#039;)
        ];
    }حالا که کانال ارتباطی رو ایجاد کردیم و مشخص شده که چه اطلاعاتی قراره داخلش جریان پیدا کنه باید بریم سمت کلاینت و اونجا به این کانال ارتباطی متصل بشیم.ارتباط با وب‌سوکت سمت کلاینتهمونطور که قبلا هم گفتم برای استفاده از وب‌سوکت‌ها در سمت کلاینت می‌تونیم از کتابخانه Laravel Echo استفاده کنیم که قابلیت‌های کافی برای این کار رو داره. البته شما می‌تونید از هر کتابخونه دیگه‌ای هم برای این کار استفاده کنید. با استفاده از دستور زیر می‌تونید کتابخونه‌های مورد نیاز رو نصب کنید.$ npm install --save-dev laravel-echo pusher-jsحالا باید این کتابخونه‌ها رو به بخش فرانت پروژه اضافه کنیم و تنظیمات اولیه رو روشون انجام بدیم.import Echo from &#039;laravel-echo&#039;;

import Pusher from &#039;pusher-js&#039;;
window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: &#039;pusher&#039;,
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? &#039;mt1&#039;,
    wsHost: import.meta.env.VITE_PUSHER_HOST
    wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
    wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
    forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? &#039;https&#039;) === &#039;https&#039;,
    enabledTransports: [&#039;ws&#039;, &#039;wss&#039;],
});اگر از vite برای bundle کردن فایل‌های پروژه استفاده کرده باشید می‌تونید با استفاده از متغیرهای تعریف شده در فایل env استفاده کنید ولی در هرصورت من مقادیر مورد نیاز رو یک‌بار دیگه توضیح می‌دم.کلید (key): همون کلید یکتایی که در بخش قبلی در اولین مرحله برای وب‌سوکت سرور ایجاد کردیم و هم در فایل websockets.php و هم فایل broadcasting.php در دایرکتوری config قرارش دادیم.هاست (wsHost): آدرس دسترسی وب‌سوکت‌سرورپورت (wsPort): پورت دسترسی به وب‌سوکت‌سروردر این مرحله باید در کانال وب‌سوکت که در سرور ایجادش گردیم subscribe کنیم یا در اصطلاح عضو بشیم.همچنین باید برای اون رخدادی که قراره توی کانال اطلاعات رو جریان بده گوش بزنگ (listen) باشیمبرای این کار می‌تونید دستورات زیر رو در  صفحه اجرا کنید:Echo.channel(&#039;test-channel&#039;)
    .listen(&#039;TestWebsocketEvent&#039;, (e) =&gt; {
        console.log(e);
    })
    .error(error =&gt; {
        console.log(&#039;channel error&#039;, error);
    }); در این مرحله اگر کلاس رخدادی که در لاراول ایجاد کرده بودیم رو اجرای کنید، خصوصیات عمومی کلاس (public properties) به داخل کانال ارتباطی جریان پیدا می‌کنن. البته به‌خاطر داشته باشید که برای این‌کار باید دستور مربوط به اجرای صف (queue)ها رو با مشخصات مورد نظر خودتون به شکل زیر در لاراول اجرا کنید.$ php artisan queue:workنمایش نوتیفیکیشن سمت فرانتبرای نمایش نوتیفیکیشن سمت کلاینت می‌تونید بعد از کسب اجازه از کاربر منتظر دریافت اطلاعات از کانال ارتباطی باشید. برای این‌کار می‌تونید از قطعه کد زیر استفاده کنید.function getNotificationsPermission() {
    Notification.requestPermission()
        .then((permission) =&gt; {
            if (permission === &amp;quotgranted&amp;quot) {
                Echo.channel(`test-channel`)
                    .listen(&#039;TestWebsocketEvent&#039;, (e) =&gt; {
                        const title = e.data.title;
                        const icon = e.data.icon;
                        const body = e.data.message;
                        const notification = new Notification(title, {body, icon});
                        notification. = function () {
                            window.parent.focus();
                            notification.close();
                        }
                    })
                    .error(error =&gt; console.log(&#039;channel error&#039;, error));
            }
        });
}

window.addEventListener(&#039;load&#039;, () =&gt; getNotificationsPermission())حالا اگر رخدادی که در سمت سرور ساخته بودیم اجرا بشه، اطلاعات اون به‌صورت نوتیفیکیشن سمت کاربر نمایش داده میشه.در این بخش تونستیم بوسیله وب‌سوکت‌ها یک کانال ارتباطی ایجاد کنیم و با استفاده از یک رخداد، اطلاعات موردنظرمون رو در داخل اون جریان بدیم. همچنین در سمت فرانت با استفاده از کتابخونه Laravel Echo در اون کانال ارتباطی ثبت‌نام کردیم و اطلاعات ارسال شده رو دریافت کردیم. در بخش بعدی با انواع کانال‌های عمومی و خصوصی بیشتر آشنا می‌شیم و از قابلیت‌های کتابخونه Laravel Echo برای ساخت یک چت‌روم استفاده می‌کنیم.حتما اگر سوالی دارید یا ابهام و اشتباهی در مطلبی که نوشتم وجود داره از طریق بخش نظرات با من در ارتباط باشید.استفاده از محتوای مطلبی که نوشتم کاملا آزاد و رایگانه و می‌تونید به دلخواه خودتون با هر نامی اون رو منتشر کنید.</description>
                <category>محسن میرحسینی</category>
                <author>محسن میرحسینی</author>
                <pubDate>Wed, 08 Nov 2023 09:22:55 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده‌سازی وب‌سوکت‌ها با لاراول</title>
                <link>https://virgool.io/@nishtman/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%D8%A8-%D8%B3%D9%88%DA%A9%D8%AA-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-wc8z47gqynod</link>
                <description>برای یه مدت طولانی در تلاش بودم که بتونم برای کاربران وب‌سایت‌ها و وب‌اپلیکیشن‌هایی که پیاده‌سازی کردم «وب‌پوش نوتیفیکیشن» بفرستم. البته کار سختی نیست اگر بخوایم از سرویس‌های مخصوص این کار مثل فایربیس گوگل، ‌Pusher و نمونه ایرانی اون پوشه استفاده کنیم. ولی من نیازهای بیشتری داشتم که می‌خواستم با استفاده از وب‌سوکت‌ها برطرفشون کنم. پس دست‌به‌کار شدم و دنبال راهکار مناسب این کار گشتم و به نتایج خوبی هم رسیدم که می‌خوام با شما در میون بزارم.با توجه به گستردگی موضوع مورد بحثمون یعنی وب‌سوکت‌ها، مجموع مواردی که می‌خوام در موردشون صحبت کنم نیاز به مقالات بیشتری داره که سعی می‌کنم در فواصل کوتاهی اون‌ها رو بنویسم و در این‌جا منتشر کنم. برای استفاده از این مطلب باید با زبان برنامه‌نویسی ‌php و فریم‌ورک محبوبش لاراول در حد حرفه‌ای کار کرده‌باشید و همچنین این نکته رو درنظر داشته باشید که چون استفاده از وب‌سوکت‌ها در سمت مرورگر کاربر هم اتفاق می‌افته باید با زبان جاوااسکریپت هم آشنایی کافی داشته‌باشید.با معرفی و راه‌اندازی اولیه وب‌سوکت‌ها شروع می‌کنیم و به عنوان اولین مورداستفاده، وب‌پوش‌نوتیفیکیشن‌ها و روش ارسالشون رو بررسی می‌کنیم.اما اینکه وب‌پوش نوتیفیکیشن دقیقا چیه و چه کاربردی داره رو حتما به خوبی می‌دونید. من می‌خوام بهتون بگم این وب‌پوش‌نوتیفیکیشن‌ها که اسمشون خیلی طولانیه و از این به بعد به‌اختصار بهشون نوتیفیکشن می‌گیم از چه طریقی برای کاربران ارسال می‌شن.وب سوکت چیست؟برای تعریف وب‌سوکت از ویکی‌پدیای انگلیسی کمک می‌گیرم.وب‌سوکت یک پروتکل ارتباطی کامپیوتری است که کانال های ارتباطی دو طرفه همزمان را از طریق یک اتصال شبکه (tcp) فراهم می کند.متوجه نکته خاصی که در همین یک پاراگراف وجود داره شدین؟  به‌طور کلی در محیط وب، کاربران با مراجعه به یک آدرس درخواستشون رو برای ما ارسال می‌کنن و برخی اوقات اطلاعاتی هم همراه این درخواست به دستمون می‌رسه. ولی وقتی بین مرورگر کاربر و سرور یک سوکت باز باشه شما می‌تونید با کاربران ارتباط دوطرفه داشته باشید. یعنی بدون این‌که درخواستی از سوی کاربر به سمت سرور بیاد، اطلاعات مورد نظرتون رو براش ارسال کنید. این اطلاعات می‌تونه قیمت و موجودی بروزشده محصولات، مطالب جدید وب‌لاگ، آمار بازدیدکنندگان سایت، پیام‌های چت‌روم و یا محتویات یک نوتیفیکیشن باشه.برای برقراری این ارتباط دو‌طرفه به‌جز اینکه باید در سمت کلاینت درخواست بازشدن ارتباط رو  به‌همراه مقداری اطلاعات شناسایی برای سرور بفرستید، باید یک وب‌سوکت سرور هم راه‌اندازی کنید تا این ارتباط دوطرفه تکمیل بشه و دقیقا در این قسمت کار نیاز داریم که از یک سرویس‌دهنده مثل فایربیس استفاده کنیم. بعد از برقراری ارتباط، باید برای ارسال اطلاعات به کاربر درخواستتون رو به وب‌سوکت سرور ارسال کنید و ازش بخواید که اطلاعات رو در کانال ارتباطی که با کاربر دارید ارسال کنه و در سمت کلاینت اطلاعات رو دریافت کنید.لاراول وب‌سوکت‌سروراول از همه بگم این عبارت وب‌سوکت سرور رو از خودم در آوردم و نمی‌دونم از نظر فنی درسته یا نه. از اونجایی که هدفمون از نوشتن این مطلب ارسال نوتیفیکیشن بدون استفاده از سرویس‌دهنده‌های دیگه است باید سرویس‌دهنده اختصاصی خودمون رو پیاده‌سازی کنیم. خیالتون رو راحت کنم که اگر پکیجی که در ادامه معرفی می‌کنم نبود، راه‌اندازی یک سرویس‌دهنده یا به قول خودمون وب‌سوکت سرور اصلا کار ساده‌ای نیست. ولی خوب خوشبختانه این کتابخونه هست تا ما به راحتی از پس این مشکل بربیایم.کتابخانه Laravel Websockets در واقع سرویس‌دهنده Pusher رو در داخل پروژه خودتون شبیه‌سازی می‌کنه و شما از هر کتابخانه سمت کلاینت که با pusher کار می‌کنه می‌تونید برای برقراری ارتباط استفاده کنید که البته پیشنهاد من Laravel Echo است که به وقتش باهاش آشنا می‌شیم.مطمئنم که در این مرحله همه شما پروژه لاراولی خودتون رو راه‌اندازی کردین و حالا وقتشه که بریم سراغ نصب کتابخانه با استفاده از کامپوزرcomposer require beyondcode/laravel-websocketsحالا با استفاده از دستور زیر به کتابخونه اجازه می‌دیم که فایل‌های مورد نیاز خودش شامل فایل تنظیمات و یک فایل میگریشن که برای ذخیره اطلاعات استفاده می‌شه در داخل پروژه ذخیره کنه.php artisan vendor:publish --provider=&amp;quotBeyondCode\LaravelWebSockets\WebSocketsServiceProvider&amp;quotو با استفاده از دستور زیر میگریشن‌ها رو اجرا می‌کنیمphp artisan migrate وقتشه که بریم سراغ تنظیمات کتابخونه که بعد از اون بتونیم وب‌سوکت سرور رو راه‌اندازی کنیماگر فایل websockets.php که حالا در دایرکتوری config قرارداره رو باز کنید، می‌تونید قسمت‌های مختلف تنظیمات این کتابخونه رو ببینید. به‌نظرمن و برای شروع فقط دوتا از این آیتم‌‌ها رو باید بشناسیم که در ادامه بهتون می‌گم.اولی یک آرایه به نام dashboard که فقط یک سطر به اسم port داخلش وجود داره و مقدار اون در واقع پورتی هست که قراره سرور روی اون اجرا بشهگزینه دوم هم یک آرایه به نام app که هر سطرش آرایه‌ای از اطلاعات مربوط به یکی از وب‌سایت‌ها یا اپلیکیشن‌های شماست که قراره با این سرور ارتباط داشته باشن. در واقع این سرور قابلیت راه‌اندازی چندین کانال ارتباطی رو داره. هر کدوم از این کانال‌ها (یا اپلیکیشن‌ها) یک شناسه یکتا نیاز دارن که در خونه id ذخیره میشه و همچنین یک اسم، یک کلید و یک رمز احتیاج دارن که به ترتیب در خونه‌های name, key, secret  ذخیره میشن. از اونجایی که این سرور قراره جایگزین سرویس‌دهنده pusher باشه میتونید از متغیرها داخل فایل env  که به‌طور پیش‌فرض هنگام نصب لاراول اونجا هستن و با پیشوند pusher_ شروع میشن استفاده کنید. این که چه مقادیری برای این متغیرها انتخاب می‌کنید اهمیتی نداره و فقط مهمه که برای هر اپلیکیشن یکتا باشن و قبلا ازشون استفاده نشده باشه و همچنین با متغیرهایی که در مرحله بعدی توضیح می‌دم یکی باشنخوب مجددا میگم چون این کتابخونه قراره جایگزین سرویس‌دهنده pusher باید کتابخونه pusher مخصوص زبان php رو هم به پروژه ضافه کنیم که با دستور زیر به سادگی انجام میشهcomposer require pusher/pusher-php-serverخوب در حال حاضر دو تا کار اساسی دیگه هم باید انجام بشهمورد اول اینکه داخل فایل env مقدار متغیر زیر رو تنظیم کنید. با این‌کار به لاراول می‌فهمونید که می‌خواید از pusher برای ارسال و دریافت اطلاعات در وب‌سوکت‌ها استفاده کنید.BROADCAST_DRIVER=pusherمورد دوم هم انجام تنظیمات مربوط به سرویس‌دهنده pusher در لاراوله که چون ما خودمون این سرور رو راه‌اندازی کردیم همون تنظیمات قبلی رو برای id, name, key و secret قرار می‌دیم و فقط آدرس و پورت دسترسی به سرویس‌دهنده رو بهش اضافه می‌کنیم. این موارد داخل فایل broadcasting.php در دایرکتوری config  و در قسمت pusher قرار داره که باید به شکل زیر تنظیم بشه&#039;pusher&#039; =&gt; [
    &#039;driver&#039; =&gt; &#039;pusher&#039;,
    &#039;key&#039; =&gt; env(&#039;PUSHER_APP_KEY&#039;),
    &#039;secret&#039; =&gt; env(&#039;PUSHER_APP_SECRET&#039;),
    &#039;app_id&#039; =&gt; env(&#039;PUSHER_APP_ID&#039;),
    &#039;options&#039; =&gt; [
        &#039;cluster&#039; =&gt; env(&#039;PUSHER_APP_CLUSTER&#039;),
        &#039;encrypted&#039; =&gt; true,
        &#039;host&#039; =&gt; &#039;127.0.0.1&#039;, //آدرس دسترسی به وب‌سوکت‌سرور
        &#039;port&#039; =&gt; 6001, //پورت دسترسی به وب‌سوکت‌سرور
        &#039;scheme&#039; =&gt; &#039;http&#039;
    ],
],تا الان تمامی تنظیمات لازم برای راه‌اندازی وب‌سوکت‌سرور رو انجام دادیم و با استفاده از دستور زیر می‌تونیم درخواست شروع به‌کار سرور رو برای لاراول ارسال کنیم.php artisan websockets:serveدر این بخش تونستیم با استفاده از کتابخونه Laravel Websockets یک سرویس‌دهنده مشابه pusher رو در اپلیکشین لاراولی خودمون راه‌اندازی کنیم. می‌دونم هنوز هیچ استفاده‌ای از این وب‌سوکت‌سرور نکردیم ولی در بخش بعدی به طور کامل شرح می‌دم که چطور یک کانال ارتباطی ایجاد کنیم و در سمت کلاینت بوسیله کتابخونه Laravel Echo به اون کانال ارتباطی متصل بشیم. پس در بخش بعدی منتظرتون هستمحتما اگر سوالی دارید یا ابهام و اشتباهی در مطلبی که نوشتم وجود داره از طریق بخش نظرات با من در ارتباط باشید.استفاده از محتوای مطلبی که نوشتم کاملا آزاد و رایگانه و می‌تونید به دلخواه خودتون با هر نامی اون رو منتشر کنید.</description>
                <category>محسن میرحسینی</category>
                <author>محسن میرحسینی</author>
                <pubDate>Sat, 04 Nov 2023 13:49:59 +0330</pubDate>
            </item>
                    <item>
                <title>چرا من عاشق Inertia.js شدم؟</title>
                <link>https://virgool.io/@nishtman/%DA%86%D8%B1%D8%A7-%D9%85%D9%86-%D8%B9%D8%A7%D8%B4%D9%82-inertiajs-%D8%B4%D8%AF%D9%85-rwhye6elnp8x</link>
                <description>چند سالی میشه که به عنوان یک فول استک برای وب برنامه نویسی میکنم. از لاراول به عنوان بک اند پروژه هام و از Vue.js  برای پیاده سازی فرانت اند استفاده میکنم. استفاده از Vue.js کمک خیلی زیادی برای پیاده سازی SPA ها به من کرده و باوجود اینکه آبم با جاوااسکریپت توی یک جوی نمیره ولی تونستم به خوبی ازش استفاده کنم. ولی ارتباط با بک اند بوسیله api و axios و ... دردسرهای خودش رو داره. حدودا چندماه پیش بود که وقتی پروژه جدید لاراول رو ایجاد کردم و میخواستم از Jetstream برای پیاده سازی ساز و کار ورود و مدیریت کاربران استفاده کنم  متوجه یک اسم عجیب و غریب در فایل package.json  شدم. Inertia.js یک کتابخانه جاوااسکریپت که به معنی واقعی کلمه به عنوان یک مبدل یا بقول مستندات خودشون چسب بین بک اند و فرانت اند عمل میکنه.در این مطلب قصد دارم کتابخانه Inertia.js رو معرفی کنم و در مورد سادگی استفاده از اون و همچنین قابلیت های فوق العادش صحبت کنم. خبری از آموزش و کد نویسی نیست ولی باید آشنایی کلی با مفاهیم وب، SPA، فرانت اند و بک اند، فراخونی api ها و ... داشته باشین تا این مطلب به دردتون بخوره.ببینیم Inertia.js چی هست؟خود من از وقتی با لاراول آشنا شدم و البته قبل از اون شیوه کارم به این شکل بود که اطلاعات مورد نیاز رو از پایگاه داده دریافت میکردم، پردازش لازم رو انجام میدادم و در نهایت به وسیله فایل های ویو به کاربر نمایششون میدادم. این ساز و کار رو تمام برنامه نویسان چه با لاراول، چه با Ruby on Rails و چه با Django  میدونن و ازش استفاده میکنن. به مراحلی که گفتم تعریف route ها رو هم اضافه کنید. ولی وقتی صحبت از SPA میشه شرایط از یه جایی به بعد یه مقدار فرق میکنه،‌ در واقع اطلاعاتی که از دیتابیس دریافت شده رو از طریق کنترلر باید تبدیل به یک رشته json کنیم تا توسط درخواست ajax که از طرف SPA  اومده قابل دریافت باشه. درون خود فریم ورک جاواسکریپتی که برای پیاده سازی ساز و کار SPA ازش استفاده کردیم هم باید در ابتدا route های مورد نیازمون رو تعریف کنیم و بوسیله axios یا کتابخونه های مشابه درخواست ها رو برای بک اند بفرستیم و پاسخ رو دریافت کنیم. Inertia.js به ما کمک میکنه که این دو بخش رو بهم دیگه بچسبونیم. کافیه اطلاعات دریافتی از دیتابیس رو در کنترلر پردازش کنید و بقیه رو به Inertia.js بسپارید تا داخل کامپوننت جاوااسکریپت اطلاعات رو بهتون تحویل بده. لازم نیست route ها رو دوباره تعریف کنید، لازم نیست نگران تبدیل اطلاعات به json باشید، لازم نیست نگران اعتبارسنجی کاربر باشید، خطاهای ولیدیشن به خوبی پردازش میشن و لازم نیست حتی نگران بروزرسانی state ها باشید. تمام پیچیدگی ها رو به Inertia.js بسپرید.چرا باید از Inertia.js استفاده کنیم؟پیچیدگی های SPA: یکی از مشکلات برنامه نویسها برای پیاده سازی SPA ها پیچیدگی مواجه شدن با مدیریت state ها، تعریف route ها، اعتبارسنجی کاربران و ... است که همه اونها توسط Inertia.js  مدیریت میشه.پیاده سازی api ها: وقتی از Inertia.js استفاده میکنید نیازی نیست نگران REST یا GraphQL باشید. Inertia.js بهتون کمک میکنه به همون شکل سنتی اطلاعات رو از طریق فریم ورک بک اند برای فرانت ارسال کنید. به راحتی با استفاده از کامپوننت &lt;inertia-link&gt; به جای &lt;a&gt; میتونید یک درخواست عادی رو به یک درخواست ajax تبدیل کنید و تمام. بقیه کارها رو به Inertia.js بسپرید. مشکلات مرورگرها: وقتی از Inertia.js استفاده میکنید خیلی از مشکلاتی که هنگام پیاده سازی SPA ها با مرورگر دارید بوسیله سرویس های داخلی Inertia.js حل میشه. مشکلاتی مثل: مدیریت حافظه مرورگر: بوسیله preserveState میتونید مقادیر state های هر کامپوننت رو نگهداری کنید تا در صورتی که کاربر به صفحات قبلی و بعد رفت آمد کرد اطلاعات از دست نره و یا میتونید از preserveScroll استفاده کنید و موقعیت اسکرال صفحه رو برای کاربر حفظ کنید.نشانگر بارگزاری صفحه: از اونجایی که درخواست های Inertia.js در واقع از نوع ajax هستند کتابخانه فوق العاده ای به نام NProgress همراه Inertia.js هست که به شکل یک نوار رنگی باریک در بالای پنجره مرورگر میزان بارگزاری صفحات رو به کاربر نمایش میده.بارگزاری و نسخه بندی فایل ها: Inertia.js حتی حواسش به این مساله هست که اگر فایل های css یا js  شما تغییر کردن به جای درخواست به صورت ajax یه درخواست کامل به صورت بارگزاری مجدد صفحه انجام بده تا از نسخه جدید فایل ها استفاده کنه.استفاده از فرم ها: به جای استفاده از فرم های معمولی که باعث میشن صفحه به طور کامل بارگزاری بشه می تونید از فرم های Inertia.js استفاده کنید. به سادگی اطلاعات مورد نیاز رو درون فرم ذخیره میکنید و Inertia.js  وظیفه ارسال اطلاعات به سرور رو بر عهده میگیره. از قابلیت های فوق العاده ای هم برخورداره مثل مدیریت خطاها، دریافت نتیجه ارسال اطلاعات به صورت onSuccess و   و همچنین اطلاع از میزان ارسال اطلاعات بوسیله form.progress و form.progress.percentageورود کاربر و بررسی سطوح دسترسی: وقتی از Inertia.js استفاده میکنید لازم نیست ساز و کار جداگانه ای برای ورود کاربر پیاده سازی کنید. دقیقا همون ساز و کاری که به همراه فریم ورک بک اند اومده به راحتی قابل استفاده است. در واقع چون از طریق کنترلرها مستقیما با Inertia.js در ارتباط هستید همون ساز و کار session ها برای مدیریت ورود کاربران استفاده میشه. همینطور در خصوص مدیریت سطح دسترسی کاربران میتونید عملیات مجاز توسط کاربر رو به شکل props به کامپوننت ارسال کنید و اونجا ازش استفاده کنید.چه کسانی میتونن از Inertia.js استفاده کنن؟خوشبختانه Inertia.js چندین فریم ورک رو به عنوان بک اند و فرانت اند پشتیبانی میکنه. از بین فریم ورک های بک اند  Inertia.js به طور رسمی از لاراول  و Ruby on Rails پشتیبانی میکنه و از بین فریم ورک های فرانت اند هم در حال حاضر Vue2، Vue3، React.js و Svelte رو پیشتبانی میکنه. البته چندین کتابخونه هم به طور غیر رسمی برای کار با Django، CakePHP، Symfony و Adonis ارائه شده که میتونید از اونها استفاده کنید.در این مطلب سعی کردم فقط Inertia.js رو بهتون معرفی کنم. حتم دارم مثل من در افزایش سرعت پیاده سازی برنامه هاتون تاثیر زیادی داره. به زودی حتما مطلب دیگه ای مینوسم و سعی میکنم به بهترین شکل در خصوص روش پیاده سازی یک پروژه با بک اند لاراول و فرانت اند Vue.js بوسیله Inertia.js و استفاده از قابلیت های اون براتون صحبت کنم.</description>
                <category>محسن میرحسینی</category>
                <author>محسن میرحسینی</author>
                <pubDate>Tue, 20 Apr 2021 11:05:02 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی نوتیفیکشن ها با لارول - قسمت دوم</title>
                <link>https://virgool.io/@nishtman/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%86%D9%88%D8%AA%DB%8C%D9%81%DB%8C%DA%A9%D8%B4%D9%86-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%84%D8%A7%D8%B1%D9%88%D9%84-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-rtfiavj4bw1y</link>
                <description>با این که مدت خیلی زیادی گذشته ولی بالاخره فرصت این رو پیدا کردم که قسمت دوم این مطلب را آماده کنم. امیدارم قسمت اول رو مطالعه کرده باشین و خوشحال میشم که پیشنهاداتتون در خصوص شیوه نگارش و البته ایراداتی که در مطالبم وجود داره رو برای من بفرستید.این قسمت نوشته هم مثل قبلی ترجمه این مطلب در سایت مدیومه و سعی کردم ضمن ترجمه که البته خیلی دقیق نیست مواردی رو به اون اضافه کنم و تا حدودی بیشتر کاربردیش کنم. مجددا میگم که استفاده از این مطلب حتی بدون ذکر نام من هیچ مانعی نداره و باعث خوشحالی من میشه.در بخش قبلی روش ایجاد یک کلاس نوتیفیکیشن و ارسال اون برای کاربران رو بررسی کردیم. در این بخش سعی میکنم بهتون بگم که چطوری یک شیوه ارسال نوتیفیکیشن یا در واقع یک کانال ارسال نوتیفیکیشن اختصاصی برای خودتون ایجاد کنید. برای مثال ارسال نوتیفیکیشن از طریق فایربیس برای گوشی های دارای سیستم عامل اندروید یا هر مورد دیگه ای که شما میخواین از اون استفاده کنید. در این مثال من ارسال نوتیفیکیشن بوسیله پیامک و استفاده از یکی از سرویس دهندگان پیامک داخلی رو نشونتون میدم که حتم دارم توی خیلی از پروژه ها استفاده میشه.خوب اول از همه باید یه کانال برای ارسال نوتیفیکیشن ایجاد کنیم. حواستون باشه این کانال ها رو با کانال های مربوط به Broadcast در لاراول اشتباه نگیرید. یه دستور ساده آرتیسن وجود داره که کانال ها رو ایجاد میکنه ولی این کانالها به درد ما نمیخورن و باید خودمون کانال ها رو ایجاد کنیم. البته کار بسیار ساده ایه. فقط کافیه در مسیر app/Channels یک کلاس به شکل زیر ایجاد کنید:&lt;?php

namespace App\Channels;

class MySmsChannel
{
    
}به خوبی هم میدونید که اسم کلاس رو هرچی دلتون بخواد میتونید بزارید. برای استفاده از این کانال دو روش وجود داره: روش اول اینه که توی فایل نوتیفیکیشن کلاس رو فراخونی کنید و روش دیگه ثبت اون در یک ServiceProvider هست که به این شکل میتونید انجام بدید:&lt;?php
namespace App\Providers;use App\Channels\MySmsChannel;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
   
    public function boot()
    {
        Notification::extend(&#039;sms&#039;, function ($app) {
            return new MySmsChannel();
        });
    }
}البته برای این کار میتونید یه سرویس پرووایدر جدید ایجاد کنید یا همانند مثال از یکی از سرویس پرووایدرهای خود لارول استفاده کنید.خوب حالا برای اینکه کانال ارسال نوتیفیکیشنمون بخوبی کار کنه باید یک متد send بهش اضافه کنیم. این متد به عنوان ورودی یک نمونه از مدلی که قراره براش نوتیفیکیشن ارسال بشه و نمونه ای از کلاس ارسال نوتیفیکیشن رو دریافت می کنه. به قطعه کدی که در ادامه نوشتم توجه کنید:&lt;?php

namespace App\Channels;

use Illuminate\Notifications\Notification;

class MySmsChannel
{
    public function send ($notifiable, Notification $notification) {
        
    }
}در این متد $notifiable همون مدل (بخونید شخص) نوتیف شونده و $notification هم کلاس نوتیفیکیشنی هست که میخوایم ارسالش کنیم.اینجا باید منطق برناممون رو پیاده سازی کنیم. بدون شک به خود شما بستگی داره که چطور میخواید به شناسه مورد نظر برای ارسال نوتیفیکیشن دست پیدا کنید. مثلا برای ارسال نوتیفیکشن با فایربیس به کلید توکنی احتیاج دارید که توسط اپ موبایل برای شما ارسال شده یا برای ارسال پیامک باید به شماره موبایل کاربر دست پید کنید. بهتره اطلاعات مورد نظر در مدلی که به عنوان ورودی به این متد ارسال کردین وجود داشته باشه. اینطوری وظیفه پیدا کردن شناسه رو به عهده خود مدل میزاریم.خوب در نظر بگیرید برای بدست آوردن شناسه از یک متد استفاده میکنیم که در کلاس مدل تعریف شده و وظیفه اون فقط و فقط برگردوندن اون شناسه (شماره موبایل، آدرس ایمیل، توکن و ...) است. هر اسمی که بخواید میتونید برای اون متد بزارید ولی چه بهتر که از یک الگوی خاص برای این منظور استفاده کنید. به تغییری که در متد send قطعه کد بالا دادم توجه کنید:&lt;?php

namespace App\Channels;

use Illuminate\Notifications\Notification;
use IPPanel\Client;
use IPPanel\Errors\Error;
use IPPanel\Errors\HttpException;

class MySmsChannel
{
    public $apiKey;
    public $originator;

    public function __construct()
    {
        $this-&gt;apiKey = &#039;xxxxxxxxxxxx&#039;;
        $this-&gt;originator = &#039;+9812345678&#039;;
    }

    public function send ($notifiable, Notification $notification) {
        if (method_exists($notifiable, &#039;routeNotificationForSms&#039;)) {
            $mobileNumber = $notifiable-&gt;routeNotificationForSms($notifiable);
        } else {
            //$mobileNumber = $notifiable-&gt;mobile_number
            $mobileNumber = $notifiable-&gt;getMobileNumberAttribute();
        }

        $data = method_exists($notification, &#039;toSms&#039;)
            ? $notification-&gt;toSms($notifiable)
            : $notification-&gt;toArray($notifiable);       
        if (empty($data)) {
            return;
        }        
        $client = new Client($this-&gt;apiKey);   
        try {
                $client-&gt;send($this-&gt;originator, $mobileNumber, $data[&#039;message&#039;]);
        } catch (Error $e) {
            Log::channel(&#039;notifications&#039;)-&gt;error(json_encode($e-&gt;unwrap()));
        } catch (HttpException $e) {
             Log::channel(&#039;notifications&#039;)-&gt;error(json_encode($e-&gt;unwrap()));
        }
         return true;
    }
}خوب توی این قطعه کد در ابتدا چک میکنیم متد routeNotificationForSms توی کلاس مدلکه قراره نوتیفیکیشن برای اون ارسال بشه وجود داره که بتونیم شماره موبایل کاربر رو ازش دریافت کنیم یا نه؟ اگر این متد وجود نداشته باشه شماره موبایل یا همون شناسه مورد نیازمون رو به طور مستقیم از مدل دریافت می کنیم.اگر به خاطر داشته باشین گفته بودم که برای هر کانال ارسال نوتیفیکیشن در کلاس نوتیفیکیشن باید یک متد مخصوص وجود داشته باشه که وظیفه رسوندن اطلاعات به کانال رو داره. در ادامه چک میکنیم که آیا متد مورد نظرمون در شی ارسال شده به عنوان کلاس نوتیفیکیشن موجود هست یا نه. در صورتی که متد toSms توی کلاس نوتیفیکیشن تعریف نشده باشه از متد toArray استفاده میکنیم که به طور پیشفرض موجوده و از مقادیر خروجی اون برای ارسال پیامک استفاده میکنیم.برای ارسال پیامک من از سامانه ippanel استفاده میکنم که با وجود امکانات بی نظیر و کیفیت فوق العاده هیچ اطلاعاتی از صاحبان اصلیش در اختیار ندارم و پنل خودم رو هم از یکی از نمایندگانشون خریداری کردم. ولی خوب یکی از امکانات خوبشون یک پکیج لاراول جهت ارسال پیامکه که با یک دستور ساده کامپوزر میتونید نصب و ازش استفاده کنید:composer require &amp;quotippanel/php-rest-sdk&amp;quotخوب حالا کلاس مدل که قراره متد routeNotificationForSms  و همچنین کلاس نوتیفیکیشن که قراره متد toSms رو پیاده سازی کنن رو کامل میکنیم://User.php
&lt;?php
namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    public function routeNotificationForLog ($notifiable) {
        return &#039;identifier-from-notification-for-log: &#039; . $this-&gt;id;
    }
}&lt;?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class WelcomeNotification extends Notification
{
    use Queueable;

    public function __construct () { }

    public function via ($notifiable) {
        // The name we used when registering in the provider
        return [ &#039;sms&#039; ];
        // Alternatively, if not registered in service provider
        // return [ \App\Channels\SmsChannel::class ];
    }

    public function toSms ($notifiable) {
        return [
            &#039;message&#039; =&gt; sprintf(&#039;Dear %s \n Welcome to our website&#039;, $notifiable-&gt;name),
        ];
    }

    public function toArray ($notifiable) {
        return [
                 &#039;message&#039; =&gt; sprintf(&#039;Dear %s \n Welcome to our website&#039;, $notifiable-&gt;name),
        ];
    }
}روش استفاده از این کلاس های نوتیفیکیشن رو هم که حتما میدونید و اگر هم نمیدونید میتونید از قسمت اول این نوشته استفاده کنید:// Approach 1
$user-&gt;notify(new WelcomeNotification());
// Approach 2
// Notification::send($user, new WelcomeNotification());امیدوارم مطالبی که نوشتم براتون مفید باشه و بتونید ازش استفاده کنید. خوشحال میشم این مطلب رو به اشتراک بزارید و کمک کنید که افراد بیشتری ازش استفاده کنن.سعی میکنم در آینده اینطور غیبت طولانی نداشته باشم و به زودی مطالب دیگه ای براتون آماده کنم.</description>
                <category>محسن میرحسینی</category>
                <author>محسن میرحسینی</author>
                <pubDate>Sun, 18 Apr 2021 12:09:47 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی نوتیفیکیشن ها با لاراول</title>
                <link>https://virgool.io/laravel-community/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%86%D9%88%D8%AA%DB%8C%D9%81%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7-%D8%A8%D8%A7-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-kxwn6yx5p6lt</link>
                <description>سلاماین اولین باره که تصمیم به نوشتن گرفتم، البته این مطلب یه جورایی ترجمه مقاله ای در سایت مدیوم بوده که از اینجا میتونید اون رو مطالعه کنید. این ترجمه خیلی دقیق و درست نیست و بعضی موارد رو حذف کردم یا بعضی جاها سعی کردم یه کم توضیحات رو بیشتر کنم. بدون شک مالکیت اصلی محتوای این مطلب متعلق به نویسنده مقاله اصلی است و شما دوستان میتونید حتی بدون ذکر نام من از محتویات این صفحه به هر شکلی که میخواید استفاده کنید.میخوام مطلب کوتاهی رو در مورد پیاده سازی نوتیفیکیشن ها در فریم ورک لاراول براتون بنویسم. در بخش اول این مطلب در ابتدا خیلی کلی استفاده از روش های موجود در لارول برای ارسال نوتیفیکیشن رو بررسی میکنیم و در بخش دوم هم ایجاد روشی جدید و کاملا شخصی برای ارسال نوتیفیکیشن رو بررسی میکنیم.این مطلب برای افرادی نوشته شده که سابقه کار کردن با فریم ورک لاراول و زبان برنامه نویسی php رو داشته باشن پس اگه به تازگی با لاراول آشنا شدین هنوز وقتش نشده که سراغ این مطلب بیاین.استفاده از نوتیفیکیشن ها میتونه خیلی بدرد بخور باشه. مواقع زیادی در چرخه حیات یک برنامه هست که نیاز میشه یک یا چند نفر از کاربرها رو از رخداد خاصی مطلع کنید. مثلا ثبت نام کاربر تو وبسایت، ثبت سفارش، افزایش مصرف منابع و ... رخدادهاییه که میتونیم از طریق ایمیل یا پیامک مدیر سیستم رو در جریان بزاریم. در مقابل دریافت پیام در سیستم، تکمیل سفارش، ارسال مطلب جدید و... هم رخدادهاییه که میتونیم برای کاربرانمون بفرستیم. در کنار این ها ممکنه حتی مخاطب نوتیفیکیشن ما یک کاربر نباشه، میتونیم یک نوتیفیکیشن برای اپ رانندمون در نرم افزار تاکسی اینترنتی ارسال کنیم و به اپ بفهمونیم که باید اطلاعات مربوط به مسافر جدید رو از سرور pull کنه و برای راننده نمایش بده. مثال های خیلی خیلی زیادی میشه از کاربرد نوتیفیکیشن ها زد که حتما تو ذهن خودتون هم همین الان کلی از اونها نقش بسته.نوتیفیکیشن ها در لاراولفریم ورک لاراول به طور پیشفرض روشهای مختلفی رو برای ارسال نوتیفیکیشن در اختیار ما میزاره. انواع این روش ها رو در اصطلاح کانال نام گزاری کردن و این کانال های پیشفرض Email, Database, Broadcast هستن.البته به جز اینها میتونید به این وبسایت مراجعه کنید تا با بیشتر از ۵۰ کانال ارسال نوتیفیکیشن مخصوص لارول که توسط جامعه توسعه دهندگان ایجاد شده، آشنا بشین.اول از همه در نظر بگیرید که ما برای ارسال نوتیفیکیشن برای کاربرامون باید این قابلیت رو در اختیار اونها بزاریم و این کار با استفاده از این trait امکان پذیره:&lt;?php
//App/User.php
//...
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
    use Notifiable
}حالا به سادگی و با استفاده از دستور جادویی artisan یک فایل نوتیفیکیشن ایجاد میکنیم:php artisan make:notification CustomerCreatedNotificationاین دستور یک فایل کلاس php در دایرکتوری App/Notifications ایجاد میکنه که به شکل زیره:&lt;?php
//App/Notifications/CustomerCreatedNotification.php
namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class CustomerCreatedNotification extends Notification
{
    use Queueable;
    public function __construct(){
        //
    }

    public function via($notifiable)
    {
        return [&#039;mail&#039;];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    -&gt;line(&#039;The introduction to the notification.&#039;)
                    -&gt;action(&#039;Notification Action&#039;, url(&#039;/&#039;))
                    -&gt;line(&#039;Thank you for using our application!&#039;);
    }

    public function toArray($notifiable)
    {
        return [ ];
    }
}خوب حالا فایل رو باز کنید که باهم بررسیش کنیم:فایل یک متد via داره که در واقع مشخص میکنه این نوتیفیکیشن قراره از طریق کدوم کانال برای کاربر ارسال بشه. خروجی این تابع آرایه ای از کانال هاست که به طور پیشفرض این آرایه فقط یک عضو داره که اونم ایمیله ولی اگر ما کانال های دیگه ای رو برای ارسال نوتیفیکیشن در نظر داشته باشیم میتونیم جایگزین کنیم یا به آرایه اضافه کنیم. این رو در نظر داشته باشید که هر فایل نوتیفیکیشن با توجه به کانال ارسال باید یک متد برای ارسال نوتیفیکیشن داشته باشه برای مثال همین فایل که قراره از کانال mail استفاده کنه متد toMail داره.در حال حاضر ما میخوایم یک کانال دیگه به این نوتیفیکیشن اظافه کنیم که در واقع هر بار که این کلاس رو فراخونی میکنیم نوتیفیکیشن از طریق دوتا کانال ارسال بشه. پس متد via به شکر زیر تغییر میکنه:public function via($notifiable)
{
    return [&#039;mail&#039; , &#039;broadcast&#039;];
}همونطور که گفتم باید یک متد برای ارسال نوتیفیکیشن متناسب با کانال انتخاب شده توی این کلاس وجود داشته باشه مثل همون toMail که مثال زدیم. ولی برای کانال های Broadcast و Database اگر این متدها وجود نداشته باشه، متد toArray فراخونی میشه که به عنوان خروجی یک آرایه برمیگردونه. در اینجا ما برای استاده از کانال Broadcast از این متد استفاده میکنیم به این شکل:public function toArray()
{
    return [
        &#039;id&#039;=&gt;&#039;identifier key&#039;,
        &#039;name&#039;=&gt;&#039;customer name&#039;
    ];
}قراره وقتی خواستیم نوتیفیکیشن رو ارسال کنیم این متد فراخونی بشه پس بهتره یه تغییرات کوچیکی تو کدهای این کلاس و البته این متد بدیم:&lt;?php
//App/Notifications/CustomerCreatedNotification.php
namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class CustomerCreatedNotification extends Notification
{
    use Queueable;
    private $customer;

    public function __construct(Customer $customer)
    {
        $this-&gt;customer = $customer;
    }

    public function via($notifiable)
    {
        return [&#039;mail&#039;, &#039;broadcast&#039;];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            -&gt;subject(&#039;New customer is created&#039;)
            -&gt;line(&#039;New customer is created at &#039; . $this-&gt;customer-&gt;created_at)
            -&gt;action(&#039;View customer profile&#039;, route(&#039;view.customer&#039;, [&#039;id&#039; =&gt; $this-&gt;customer-&gt;id]))
            -&gt;line(&#039;Thank you for using our application!&#039;);
    }

    public function toArray($notifiable)
    {
        return [
            &#039;id&#039; =&gt; $this-&gt;customer-&gt;id,
            &#039;fullName&#039; =&gt; $this-&gt;customer-&gt;first_name . &#039; &#039; . $this-&gt;customer-&gt;last_name,
            &#039;registration_date&#039; =&gt; $this-&gt;customer-&gt;created_at
        ];
    }
}خوب از اونجایی که قراره وقتی مشتری جدید ثبت نام کرد این نوتیفیکیشن برای مدیر سیستم ارسال بشه پس یک نسخه از مشتری ثبت نام شده رو به عنوان آرگومان برای این کلاس میفرستیم که بتونم از اطلاعاتش استفاده کنیم. فکر میکنم بقیه چیزها کاملا مشخصه و وقتشه که نوتیفیکیشن رو برای کاربرمون ارسال کنیم. برای ارسال نوتیفیکیشن از این قطعه کد استفاده میکنیم://CustomerController.php

public function store(Request $request){
   $customer=new \App\Customer::created(request-&gt;all());
   $admin=User::find(1);
    //Method #1   
    $admin-&gt;notify(new CustomerCreatedNotification($customer));
    //Method #2
    $admin-&gt;notifyNow(new CustomerCreatedNotification($customer));
    //Method #3
    \Illuminate\Support\Facades\Notification::send($user,new CustomerCreatedNotification($customer));
    //Method #4
    \Illuminate\Support\Facades\Notification::sendNow($user,new CustomerCreatedNotification($customer));
}حالا تفاوت این روش ها چیه:در دو روش اول شما از همون trait که به مدل اضافه کردیم استفاده میکنید و بنابراین باید قبل از این، کاربر نوتیف شونده (D:) رو مشخص کنید. تفاوتشون هم در اینه که در اولی ارسال نوتیفیکیشن در صف قرار میگیره و در دومی همونطور که از اسمش مشخصه در همون لحظه ارسال میشه. فقط در جریان باشید که اگر قراره نوتیفیکیشن برای ارسال در صف قرار بگیره حتما باید کلاس نوتیفیکیشنتون اینترفیس ShouldQueue رو پیاده سازی کرده باشه.یه تفاوت مهم بین این دو روش اینه که در روش اول (متد ۱ و ۲) شما نوتیفیکیشن رو میتونید برای یک مدل یا کاربر ارسال کنید ولی در روش دوم (متد ۳ و۴) میتونید به عنوان اولین آرگومان یک شی از کلاس مورد نظر یا یک آرایه و یا طبق سُنَت لاراول یک کالکشن از مدلها رو ارسال کنید.خوب بقیه کارها رو میسپاریم به لاراول. وقتی یکی از این متدها رو فراخونی کنید باید یک ایمیل ارسال بشه و تو فایل لاگ هم مقدار خروجی تابع toArray ذخیره بشه.چه کارهای دیگه ای میشه کرد؟اگر نمیخواید یک کلاس نوتیفیکیشن رو ارسال کنه میتونید تو متد via یک آرایه خالی برگردونید.مدل هایی که از trait مربوط به notifiable استفاده میکنن میتونن متدهای routeNotificationForMail، routeNotificationForDatabase، receivesBroadcastNotificationsOn رو پیاده سازی کنن. این متدهای برای این استفاده میشن که کانال بدونه چطوری میتونه نوتیفیکیشن رو برای کاربر ارسال کنه. به زبان ساده میتونید در نظر بگیرید مثلا برای کانال Email چطوری فیلد ایمیل کاربر رو بدست بیاره. البته وقتی از trait استفاده میکنید خودش ترتیب دوتا متد اول رو میده ولی شما میتونید در صورت نیاز اونها رو دوباره نویسی کنید.کلاس های نوتیفیکیشنی که اینترفیس ShouldQueue رو پیاده سازی کرده باشن مثل job ها میتونن از فیلدهای connection, queue, delay استفاده کنند و البته از متدهای onConnection, onQueue, delay.میتونید یه متد failed توی کلاس نوتیفیکیشنتون پیاده سازی کنید تا اگر به هر دلیلی ارسال نوتیفیکیشن با مشکل مواجه شد یه Exception براتون پرتاب بشه.همچنین مثل job ها از متدهای retryAfter و retryUntil برای سازوکار تلاش های مجددتون استفاده کنید.حتی بعد از این که نوتیفیکیشن رو در صف ارسال گذاشتین میتونید ارسال اون رو متوقف کنید. دقیقا لحظه ارسال یک event به اسم NotificationSending فراخونی میشه. فقط کافیه یک Listener برای اون درنظر بگیرید. این event یک شی از نوع notifiable ، یک شی از نوع notification و اسم کانالی که نوتیفیکیشن میخواد از اون ارسال بشه رو به عنوان آرگومان در یافت میکنه. فقط کافیه برای جلوگیری از ارسال نوتیفیکیشن در این event مقدار false رو برگردونین.تقریبا تمام چیزهایی که برای ارسال نوتیفیکیشن لازم دارید اینجا نوشتم. البته این همه چیز نیست و میدونم که خودتون خیلی راحت میتونید با بررسی مستندات خود لاراول مواردی که لازم دارید رو بددست بیارید. در اولین فرصت بخش دوم این مطلب رو آماده میکنم و اونجا توضیح میدم که چطور میتونید برای خودتون یک کانال ارسال نوتیفیکیشن درست کنید. مثلا میخواید از یک شرکت تامین کننده پیام کوتاه استفاده کنید و برای کاربرانتون پیام کوتاه بفرستید یا روش های دیگه ای که ممکنه به ذهنتون برسه.دوباره میگم که این مطلب یه جورایی ترجمه نه چندان دقیق مقاله ای در سایت مدیوم بوده که از اینجا میتونید اون رو مطالعه کنید.</description>
                <category>محسن میرحسینی</category>
                <author>محسن میرحسینی</author>
                <pubDate>Tue, 06 Oct 2020 08:15:06 +0330</pubDate>
            </item>
            </channel>
</rss>