<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های mehdi.haydari</title>
        <link>https://virgool.io/feed/@mehdi.haydari</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 10:50:32</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2261/avatar/gSH0zW.png?height=120&amp;width=120</url>
            <title>mehdi.haydari</title>
            <link>https://virgool.io/@mehdi.haydari</link>
        </image>

                    <item>
                <title>نگاه اجمالی به دیزاین پترن</title>
                <link>https://virgool.io/@mehdi.haydari/%D9%86%DA%AF%D8%A7%D9%87-%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C-%D8%A8%D9%87-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-dyqxgmqtodsx</link>
                <description>این نوشته ترکیبی از ترجمه کتاب Design Patterns Explained Simply هست به علاوه چیزهایی که خودم از پترن دیزاین میدونستم یا قبلا به صورت تکه تکه توی اینترنت خوندم. در اصل این نوشته تلاش من برای بازنشر اطلاعاتی هست که در این مورد جمع کردم. مطمعنا کامل نیست و اگه نوشته کاملتری داشتید یا برای هرکدوم از الگوها پست خوبی دارید (یا جایی میشناسید) برای من بفرستید لینکش میکنم. خودم هم سعی میکنم هر الگو رو طی یک پست ویرگولی توضیح کاملی بدم بعد از اینکه خودم فهمیدم چی هست.الگوی طراحیتوی مهندسی نرم افزار یه مفهومی هست به اسم دیزاین پترن یا الگوی طراحی. دیزاین پترن ها راه حل های عمومی هستند که میتونن برای مسایل معمول و مختلف توی طراحی نرم افزار استفاده بشن. دیزاین پترن، طراحی نهایی یک محصول نیست و با کد اجرایی فرق داره. دیزاین پترن یک توصیف یا قالبی هست از اینکه یک مساله در شرایط مختلف چجوری باید حل بشه. دیزاین پترن ها باعث میشن نگهداری کد راحت بشه چرا که ساختار کدها یکسان و آشناست. و بعد از گذشت زمان هم درکش راحته. دیزاین پترن ها انواع مختلفی دارند و معمولا به سه دسته اصلی Structural (ساختاری)، Creational (آفرینشی!) و Behavioral (رفتاری) تقسیم میشن. البته دیزاین پترن همیشه مفید نیست و باید بدونید که کجا باید ازش استفاده کرد، نکرد و کدوم رو استفاده کرد. استفاده نادرست ازش میتونه فرآیند کدنویسی رو زجرآور و طولانی کنه.دیزاین پترن ها البته مخالف های مهم و بزرگی هم دارند. یکی از انتقادهایی که به دیزاین پترن هست اینه که بیشتر الگوها برای زبان های قدیمی به طور مشخص برای ++C و small talk بودند و توی زبان های امروزی این کارها توسط خود زبان ساده سازی شدند کلا راه حل دیگه ای ارایه شده. این حرف رو Peter Norvig زده.نظر پل گراهام یک مقداری فلسفی تره. ایشون میگن در بهترین حالت یک مفهوم نباید کپی بشه بلکه باید به اون رفرنس داده بشه از طرف دیگه اگر به چیزی اشاره بشه به جای اینکه کپی بشه دیگه اون چیز نمی تونه الگو باشه.حرف این دو بزرگوار اینه که پترن دیزاین ها مستقل از زبان نیستند و این کمبود برخی زبان ها هست که باعث میشه به این الگو ها نیاز پیدا کنیم. پیتر نورویگ طی یک تحقیقی نشون داده که ۱۶ مورد از  ۲۳ پترن دیزاین که توی کتاب Design Patterns هست، که تمرکزش روی ++C بوده دیگه توی زبانهایی مثل Lisp و Dylan توسط امکانات خود زبان ساده سازی شدند و یا توسط پشتیبانی زبان دیگه نیازی بهشون نیست و پیچیدگی اضافه میکنن به کد. از طرفی ایده دیزاین پترن این هست که یک راه حل که در حال حاضر بهترین هست رو استاندارد کنه. خوب این به نظر عالی میاد، ولی در عمل نتیجه تکرارهای غیر ضروری کد هست. معمولا یک راه حل بهینه با پیاده سازی خوب بهتر از یک پترن دیزاین هست. برخی ها هم معتقدند که این مفاهیم با بقیه مفاهیم فرق چندانی نداره و صرفا یک اسم گذاری مجدد روی برخی مفاهیم هست. مثلا MVC که سابقه بیشتری نسبت به پترن دیزاین داره، به عنوان یک دیزاین پترن توی کتاب معرفی شده.الگوهای Creationalاین دیزاین پترن ها تمرکزشون توی ایجاد نمونه از آبجکت ها هستش تا آبجکت رو با توجه به موقعیت به صورت مناسبتر ایجاد کنه. این دیزاین پترن ها سعی می کنن تا پیچیدگی رو کم کرده و بی ثباتی توی ایجاد آبجکت رو کنترل کنند. ایجاد تغییر توی عملگرها معمولا کار دردسرسازی و بعد از گذر زمان تغییر توی توابع و کلاس ها باعث اشکال توی سیستم بشه.الگوی Abstract Factory : ایجاد یک شی که از کلاس های هم خانواده دیگر ارث می برد.الگوی Builder : جداسازی ساختار از نمایش آبجکت.الگوی Factory Method : ایجاد یک آبجکت شامل چند کلاس بطوریکه پردازنده عمل مشخص نشده باشه.الگوی Object Pool : پیشگیری از بدست آوردن و رها کردن منابع پرهزینه توسط بازیافت آبجکت هایی که دیگر استفاده نمی شوند.الگوی Prototype : یک نمونه کاملا مقداردهی شده جهت کپی یا کلون.الگوی Singleton : یک کلاس از آبجکت هایی که فقط یک نمونه از آن باید در سیستم باشد.الگوهای Structuralاین دیزاین پترن ها هدف سهولت طراحی از طریق شناخت یک راه ساده برای برقراری ارتباط بین موجودیت ها را دارد.الگوی Adapter : این پترن مانند یک پل دو اینترفیس ناسازگار را یکجا جمع می کند.الگوی Bridge : اینترفیس آبجکت را از پیاده سازی جدا می کند.الگوی Composite : استفاده از گروهی از آبجکت ها به مانند یک آبجکت.الگوی Decorator : امکان اضافه کردن عملکرد جدید به آبجکت.الگوی Facade : یک کلاس برای دسترسی به کل زیر سیستم.الگوی Flyweight : سعی بر کمینه کردن استفاده از مموری و کاستن از تعداد آبجکت دارد.الگوی Private Class Data : محدود کردن دسترسی به آبجکت.الگوی Proxy : آبجکت برای نمایش و دسترسی به آبجکت دیگر.الگوهای Behavioralاین دیزاین پترن ها با یافتن نحوه ارتباط بین آبجکت ها سعی در الگو کردن نحوه ارتباط دارند. این عامل باعث افزایش انعطاف پذیری در ارتباطات با بیرون از آبجکت می شود.الگوی Chain of Responsibility : یک راه برای ارسال درخواست بین زنجیره ای از درخواست ها بین اشیا.الگوی Command : کپسوله سازی درخواست به عنوان یک آبجکت.الگوی Interpreter : روشی برای اضافه کردن المان های زبان به برنامه.الگوی Iterator : دسترسی متوالی به المان های یک کالکشن.الگوی Mediator : تمرکزش روی تعریف ارتباط ساده بین بین کلاس ها هست.الگوی Memento : استفاده از آبجکت و برگرداندن آن به حالت اولیه بعد از استفاده.الگوی Null Object :‌ بی رفتاری به عنوان رفتار پیش فرض.الگوی Observer : اطلاع دادن تغییرات به کلاس های استفاده کننده.الگوی State : تغییر رفتار آبجکت در هنگام تغییر وضعیت.الگوی Strategy : کپسوله کردن الگوریتم ها در کلاس و استفاده به نسبت شرایط.الگوی Template Method : واگذاری مراحل الگوریتم به زیر کلاس.الگوی Visitor : تعریف عملکرد جدید به کلاس بدون تغییر.</description>
                <category>mehdi.haydari</category>
                <author>mehdi.haydari</author>
                <pubDate>Sun, 25 Nov 2018 01:18:55 +0330</pubDate>
            </item>
                    <item>
                <title>دیپلای لاراول اپلیکیشن روی هاست اشتراکی</title>
                <link>https://virgool.io/@mehdi.haydari/%D8%AF%DB%8C%D9%BE%D9%84%D8%A7%DB%8C-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D8%B1%D9%88%DB%8C-%D9%87%D8%A7%D8%B3%D8%AA-%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9%DB%8C-gjgv1q7lghtu</link>
                <description>منبعقبل از همه چیز باید بگم که تا جایی که ممکن هست برای پروژه های جدیتون این کار رو نکنید. ولی خوب بعضی وقتا لازم هست که سایت رو برای دمو یا چیزایی مثل این بندازید روی یه هاست ارزون و کارتون رو راه بندازین. خود چیزی هم که اینجا میخونید تقریبا ترجمه Deploying Laravel 5 applications on shared hosting without the use of SSH و بعضی تجربیات خودم هست.خوب برای راه اندازی سایت روی هاست دو تا راهکار دارید. یکیش اینکه سایت رو بندازید توی پوشه www و فایل index.php رو از پوشه پابلیک بیارید توی روت پروژه. این کار مشکلی که داره اینه که وقتی فایل ایندکس رو میارید روت دسترسی به بقیه جاها راحت میشه و مشکل امنیتی داره. راه دیگه هم چیزیه که توی این نوشته قراره توضیح داده میشه.آپلود سایتفرض میکنیم ما پروژه ای رو با اسم laravel50 توسعه دادیم و الان میخوایم آپلودش کنیم روی هاست.ساختار پروژه۱. پروژه رو با همه فایل هاش (حتی htaccess.) کامپرس کنید ۲. برید به سی پنل یا هر پنل دیگه ای دارید۳. روی File manager و بعدا روی Upload کلیک کنید۴. فایل کامپرس شده رو آپلود کنید۵. فایل رو دی کامپرس کنید توی روت هاست ( نه توی www یا public_html) پوشه laravel50 در روت هاست۶. خوب حالا محتوای دایرکتوری public توی پروژه رو انتقال بدید به public_html خود هاست.۷. حالا باید جای جدید پروژه رو به فایل ایندکس بگیم. فایل index.php رو باز کنید و خطوط:require __DIR__.&#039;/../bootstrap/autoload.php&#039;;
 ...
 $app = require_once __DIR__.&#039;/../bootstrap/app.php&#039;;رو بهrequire __DIR__.&#039;/../laravel50/bootstrap/autoload.php&#039;;
 ...
 $app = require_once __DIR__.&#039;/../laravel50/bootstrap/app.php&#039;;نکته: به جای laravel50 باید اسم پروژتون رو بنویسید.۸. حالا برای اینکه لینک ها درست کار کنن باید htaccess. رو تغییر بدیم.&lt;IfModule mod_rewrite.c&gt;
&lt;IfModule mod_negotiation.c&gt;
Options -MultiViews
&lt;/IfModule&gt;
RewriteEngine On
# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller…
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
&lt;/IfModule&gt;۹. اگه همه چیز اوکی بود میتونید با رفتن به آدرس سایتتون باید به صورت موفقیت آمیزی ارور دیتابیس رو ببینید.پایگاه دادهبرای پایگاه داده اول باید یه اکسپورت از دیتابیس لوکال بگیریم. هر cpanel معمولا یک phpMyAdmin داره. بازش کنید و یه دیتابیس بسازید. اکسپورتی که گرفتید رو توی دیتابیسی که ساختید ایمپورت کنید.حالا باید برید به config/database.php و مشخصات دیتابیس جدید رو بهش بدید.به روز رسانی ۱: آپلود کردن و گرفتن فایل از هاستبرای اینکه دیگه شورت کاتی به استوریج وجود نداره بنابراین باید فایل ها مستقیم توی قسمت پابلیک آپلود و از اونجا هم خونده بشه. برای این کار توی دایرکتوری کانفیگ filesystems.php رو باز کنید و این تغییرات رو توش بدید: &#039;disks&#039; =&gt; [
       &#039;local&#039; =&gt; [
                   &#039;driver&#039; =&gt; &#039;local&#039;,
                   &#039;root&#039; =&gt; &quot;/your/storage/in/public_html&quot;,
                   &#039;url&#039; =&gt; env(&#039;APP_URL&#039;).&#039;/public/storage&#039;,
       ],
        &#039;public&#039; =&gt; [
                    &#039;driver&#039; =&gt; &#039;local&#039;,
                    &#039;root&#039; =&gt; storage_path(&#039;/app/public&#039;),
                    &#039;url&#039; =&gt; env(&#039;APP_URL&#039;).&#039;/public/storage&#039;,
                    &#039;visibility&#039; =&gt; &#039;public&#039;,
         ],
         &#039;s3&#039; =&gt; [
                    &#039;driver&#039; =&gt; &#039;s3&#039;,
                    &#039;key&#039; =&gt; env(&#039;AWS_ACCESS_KEY_ID&#039;),
                    &#039;secret&#039; =&gt; env(&#039;AWS_SECRET_ACCESS_KEY&#039;),
                    &#039;region&#039; =&gt; env(&#039;AWS_DEFAULT_REGION&#039;),
                    &#039;bucket&#039; =&gt; env(&#039;AWS_BUCKET&#039;),
                    &#039;url&#039; =&gt; env(&#039;AWS_URL&#039;),
         ],
  ],</description>
                <category>mehdi.haydari</category>
                <author>mehdi.haydari</author>
                <pubDate>Sun, 21 Oct 2018 00:14:38 +0330</pubDate>
            </item>
                    <item>
                <title>ارسال نوتیفیکیشن با استفاده از وان سیگنال در لاراول - ۰</title>
                <link>https://virgool.io/Software/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%86%D9%88%D8%AA%DB%8C%D9%81%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%88%D8%A7%D9%86-%D8%B3%DB%8C%DA%AF%D9%86%D8%A7%D9%84-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%DB%B0-brbt2q32elo9</link>
                <description>قبل از هرچیزی باید بگم من متخصص وان سیگنال و لاراول و ... نیستم. من صرفا چند وقتی بود که دوست داشتم چیزایی که یاد میگیرم و به درد بخور هستند رو یک جا جمع کنم و بنویسم. بنابراین چیزایی که مینویسم ممکن بهترین راه حل نباشن و فقط راه حلی باشن که کار میکنه.منبع عکس قضیه اینه که توی یک پروژه من نیاز به ارسال نوتیفیکیشن به وب و موبایل دارم و برای این کار با یکم جستجو و پرسیدن به این نتیجه رسیدم که باید از وان سیگنال استفاده کنم. حالا هر مرحله از کار رو توی چند تا پست اینجا مینویسم.اضافه کردن اپ به اکانت وان سیگنالبرید به سایت وان سیگنال و اگه عضو نیستید باید عضو بشید تا بتونید از سرویس استفاده کنید.بعد از ورود به سایت با صفحه زیر روبرو میشین:صفحه اصلی سایت بعد از لاگینحالا شما میتونید با کلیک روی Add a new app پروفایل رو برای اپ و یا سایتتون اضافه کنید. بعد از کلیک روی Add a new app یه باکس براتون میاره تا اسم اپ رو وارد کنید. اسمی که دوست دارید رو بنویسید و create رو بزنید. پروفایل براتون ساخته میشه و شما ریدایرکت میشید به پنل و چون دفعه اول برای این اپ با پنل روبرو میشید سایت یه باکس مثل این به شما نشون میده:باکس انتخاب پلتفرمتوی این باکس پلتفرمتون رو انتخاب میکنید. در اصل این باکس یه میانبر هست تا سریعتر برید به کانفیگ وان سیگنال برای پلتفرمتون و شما میتونید ببندید و از منوی اصلی این کار رو بکنید یا برای بقیه پلتفرها باید از منو اصلی این کار رو بکنید. خوب اینجا چون میخوایم نوتیفیکیشن برای وب بره Web Push رو انتخاب میکنیم و ادامه میدیم. خوب مرحله بعد کانفیگ نوتیفیکیشن برای وبسایت هست. خود این مرحله از چند قسمت تشکیل شده:1- Choose Integrationاینجا باید نوع سایت یا بهتر بگم نوع بسته ای که میخواید رو مشخص کنید. برای یه کار معمول با لاراول که نیازی به SDK و پلاگین نیست Typical Site رو انتخاب میکنیم.2 - Site Setupتوی این قسمت باید اسم و آدرس سایت رو ثبت کنید. توی قسمت Site name عنوان سایت و توی قسمت Site URL آدرس سایت رو بنویسید. اگه سایتتون فعلا دامین نداره و روی لوکال هست میتونید از http://localhost (یا اگه مثل من از سابدامین استفاده میکنید http://subdomain.localhost) استفاده کنید. DEFAULT ICON URL هم برای آیکونی هست که کنار نوتیفتون میاد میتونید خالی بزارید یا آپلود کنید. اگه از پروتکل HTTP استفاده میکنید باید لیبل هم داشته باشید توی نوتیفیکیشن های خودتون. این لیبل رو باید قسمت CHOOSE A LABEL وارد کنید. حواستون باشه که اگه کاربراتون بیشتر از ۱۰۰ تا شد دیگه نمیتونید تغییرش بدید.3 - Permission Prompt Setupتوی این قسمت باید نوع درخواست مجوز رو انتخاب کنید. برای اینکه بتونید به کاربر نوتیفیکیشن نشون بدید، باید کاربر روی مرورگرش این اجازه رو به شما بده. این درخواست به دو شکل هست. اولی Subscription bell که یه دکمه قرمز یا اگه رنگش رو عوض کنید به اون رنگ تو یه گوشه از صفحه سایتتون نشون داده میشه. حالت دوم Slide prompt هست که با ورود به سایت از کاربر میپرسه که اجازه میده برای نوتیفیکیشن یا نه. شما میتونید متن این سوال رو هم تعیین کنید.4 - Welcome Notificationاین قسمت اختیاری هست و میتونید غیرفعالش کنید. توی این قسمت ما محتوای نوتیفیکیشنی که بعد از قبول اشتراک کاربر باید ارسال بشه رو تعیین میکنه. منظور از اشتراک همون اجازه ای هست که کاربر میده تا از این به بعد بهش نوتیفیکیشن ارسال بشه.5 - Advancedتنظیم این قسمت هم اختیاری هست. توی این قسمت میتونید با فعال کردن Webhook آمار کلیک ها روی نوتیفیکیشن هاتون رو داشته باشید و پیگیری کنید. توی قسمت Click Behavior هم مشخص میکنید که با کلیک روی نوتیفیکیشن چه اتفاقی بیوفته. آخرین گزینه هم Persistence هست که با فعال کردنش نوتیفیکیشن شما تا زمانی که کاربر روش کلیک نکرده توی صفحه باقی میمونه.بعد از اینکه تنظیمات رو انجام دادید ذخیره کنید تا شما رو به صفحه بعد بفرسته سایت. توی این صفحه یه کد شبیه این براتون نشون داده میشه:&lt;script src=&quot;https://cdn.onesignal.com/sdks/OneSignalSDK.js&quot; async=&quot;&quot;&gt;&lt;/script&gt;
&lt;script&gt;
  var OneSignal = window.OneSignal || [];
    OneSignal.push(function() {
        OneSignal.init({
          appId: &quot;b8576vd-bsv7d-jnvs89-xyzq-df8d9876cd8f1&quot;,
        });
  });
  &lt;/script&gt;ین کد رو باید توی سایتتون کپی کنید. بعد از این کار سایت رو باز کنید.همونطور که توی عکس هم هست بعد از ورود کاربر ازش برای اجازه ارسال نوتیفیکیشن پرسیده میشه که اگه این اجازه رو بده از این به بعد نوتیفیکیشن ها رو دریافت میکنه.ارسال نوتیفیکیشن از پنل وان سیگنالبرای ارسال نوتیفیکیشن توی پنل اپ برید به قسمت MESSAGE  توی اون قسمت رو NEW PUSH کلیک کنید تا صفحه مربوط به پوش رو براتون باز کنه. باز هم این قسمت از چند بخش تشکیل شده قسمت اول یا AUDIENCE مشخص کننده اینه که چه کسایی دریافت کننده باشند.  توی قسمت دوم باید عنوان و متن رو بنویسید. توی قسمت سوم یا آپشن ها میتونید مرورگرهای دریافت کننده، عکس و آیکن نوتیفیکیشن، پارامتر دلخواه، لینکی که باید بعد از کلیک روی نوتیفیکیشن باز بشه، اولویت و تعداد روزهایی که نوتیفیکیشن قابل نشان دادن هست رو میتونید تعیین کنید. قسمت آخر هم مربوط میشه به زمانبندی ارسال که با استفاده از این قسمت میتونید نوتیفیکیشن رو برای زمان خاصی ست کنید.بعد از اینکه تنظیمات رو انجام دادید تایید کنید و توی پنجره بعدی Send message رو بزنید تا ارسال بشه. توی صفحه بعدی همیشه میتونید آمار نوتیف ارسالیتون رو ببینید.</description>
                <category>mehdi.haydari</category>
                <author>mehdi.haydari</author>
                <pubDate>Wed, 06 Jun 2018 18:03:09 +0430</pubDate>
            </item>
            </channel>
</rss>