<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات جامعه توسعه دهندگان لاراول</title>
        <link>https://virgool.io/laravel-community/feed</link>
        <description>جامعه توسعه دهندگان لاراول در ایران، ما در اینجا سعی میکنیم توسعه دهندگان لاراول رو در کنار هم جمع کنیم و دانش مان را در اختیار هم دیگر قرار دهیم، تا بتوانیم دنیای بهتری رو بسازیم</description>
        <language>fa</language>
        <pubDate>2026-04-14 10:54:42</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/rzr2atpdaeji/cnzw2o.png</url>
            <title>جامعه توسعه دهندگان لاراول</title>
            <link>https://virgool.io/laravel-community</link>
        </image>

                    <item>
                <title>ویژگی‌های جدید Laravel 11 بخش اول</title>
                <link>https://virgool.io/laravel-community/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-laravel-11-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-e2xabsudhefp</link>
                <description>سلام رفقا من علیرضا احمدی هستم و بیش از ۱۲ ساله که دارم برنامه نویسی میکنم عاشق زبان برنامه نویسی php و python هستم و سمت php مثل همه فریمورک لاراول رو خیلی دوست دارم و ویژگی های جدیدش رو دنبال میکنم، امروز تصمیم گرفتم در مورد برخی از ویژگی های جدیدش باهاتون صحبت کنم طبیعتا این پست بخش های مختلفی رو خواهد داشت و قسمت مقدمه اش رو هم قبلا در وبلاگم (معرفی لاراول 11 : رونمایی از ویژگی های جدید laravel 11 ) صحبت کرده بودم من عاشق اموزش هستم و حتی توی تایم های آزادم به تدریس خصوصی لاراول مشغول هستم این جا دوست دارم در مورد بهبود در Job Batching در لاراول ۱۱ صحبت کنم معرفی Job Batching در لاراول ۱۱ : در Laravel 10 و نسخه‌های قبل از آن، مدیریت دسته‌ای از Jobها (Job Batching) به صورت محدودتری انجام می‌شد و قابلیت‌های پیشرفته‌ای که در Laravel 11 معرفی شده‌اند، وجود نداشت. در ادامه، نحوه استفاده از Job Batching در Laravel 10 و قبل از آن را بررسی می‌کنیم.مثالی از نحوه استفاده از Job Batching در Laravel 10:مثالی از نحوه استفاده از Job Batching در Laravel 10:phpCopy codeuse App\Jobs\ProcessPodcast;
use App\Jobs\ReleasePodcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

Bus::batch([
    new ProcessPodcast,
    new ReleasePodcast
])-&gt;then(function (Batch $batch) {
    // همه Jobها با موفقیت انجام شد
})-&gt;catch(function (Batch $batch, Throwable $e) {
    // یکی از Jobها شکست خورده است
})-&gt;finally(function (Batch $batch) {
    // این کد همیشه اجرا می‌شود، چه Jobها موفق شوند یا شکست بخورند
})-&gt;dispatch();مقایسه با Laravel 11 :در Laravel 11، قابلیت Job Batching بهبود یافته و امکانات بیشتری اضافه شده است. بهبودهای عمده شامل قابلیت مدیریت بهتر دسته‌ها، امکان بررسی وضعیت هر Job به صورت دقیق‌تر و ارائه گزارش‌های دقیق‌تر از وضعیت اجرای Jobها می‌شود. این ویژگی‌ها به توسعه‌دهندگان این امکان را می‌دهد که کنترل بیشتری بر روی اجرای Jobهای دسته‌ای داشته باشند.برای مقایسه، در ادامه همان مثال قبلی با بهبودهای Laravel 11 را می‌بینیم:برای مقایسه، در ادامه همان مثال قبلی با بهبودهای Laravel 11 را می‌بینیم:phpCopy codeuse App\Jobs\ProcessPodcast;
use App\Jobs\ReleasePodcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;

Bus::batch([
    new ProcessPodcast,
    new ReleasePodcast
])-&gt;then(function (Batch $batch) {
    // همه Jobها با موفقیت انجام شد
})-&gt;catch(function (Batch $batch, Throwable $e) {
    // یکی از Jobها شکست خورده است
})-&gt;finally(function (Batch $batch) {
    // این کد همیشه اجرا می‌شود، چه Jobها موفق شوند یا شکست بخورند
})-&gt;name(&#039;Podcast Processing Batch&#039;)  // نامگذاری دسته برای مدیریت بهتر
-&gt;onQueue(&#039;podcasts&#039;)  // اختصاص صف خاص برای دسته
-&gt;allowFailures()  // اجازه به شکست خوردن برخی از Jobها بدون توقف دسته
-&gt;dispatch();نتیجه‌گیریدر حالی که Laravel 10 قابلیت‌های ابتدایی Job Batching را معرفی کرد، Laravel 11 با ارائه ویژگی‌های جدید و بهبود یافته، کنترل و امکانات بیشتری را برای مدیریت دسته‌های Jobها به توسعه‌دهندگان ارائه می‌دهد. این بهبودها شامل نامگذاری دسته‌ها، اختصاص صف‌های خاص، اجازه به شکست برخی از Jobها و دیگر امکانات پیشرفته می‌شود که تجربه بهتری در مدیریت Jobها فراهم می‌کند.امیدوارم از خواند این مقاله لذت برده باشید </description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Mon, 27 May 2024 10:06:27 +0330</pubDate>
            </item>
                    <item>
                <title>مدیریت تاریخ و زمان در لاراول توسط کربن</title>
                <link>https://virgool.io/laravel-community/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AA%D9%88%D8%B3%D8%B7-%DA%A9%D8%B1%D8%A8%D9%86-wwk0xnroqthq</link>
                <description> مدیریت تاریخ و زمان در لاراول توسط کربنبرای کار با تاریخ و زمان در PHP و لاراول می‌تونیم از توابع و کلاس‌های PHP استفاده کنیم ولی همونطور که میدونید این روش پیچیدگی‌هایی داره و برای همین بسیاری از توسعه‌دهنده‌ها از پکیج دیگه‌ای به اسم Carbon استفاده می‌کنند.پکیج کربن در واقع یک افزونه برای DateTime در PHP هست که در پس‌زمینه از کلاس DateTime ارث‌بری میکنه. به کمک این پکیج کدهای ساده‌تر و بامعنی‌تر تولید میشه و همچنین خوانایی و قابلیت نگه‌داری برای تاریخ و زمان به پروژه اضافه میشه.فریمورک لاراول به‌طور پیش‌فرض از Carbon استفاده می‌کنه ولی در مستندات چیز زیادی دربارش نگفته پس لازمه که خودمون وارد عمل بشیم و بفهمیم که چطور باید تاریخ و زمان رو در لاراول به کمک Carbon مدیریت کنیم.کربن چه کارهایی رو انجام می‌ده؟به طور خلاصه تعامل با تاریخ، زمان و timezone(منطقه زمانی) به کمک کربن راحت‌تر میشه، یعنی:ساخت datetimeتبدیل datetime بین timezoneهای مختلفایجاد تغییرات در datetime(اضافه و کم کردن)محاسبه اختلاف بین دو فاصله زمانیتبدیل datetime به متن مناسب و قابل فهم برای انسان‌هالطفا تکه کد پایین رو ببینید تا متوجه پتانسیل کربن در ایجاد سادگی، زیبایی و خوانایی در پروژه بشید:$trialExpires = now()-&gt;addDays(30);فراخوانی و خواندن تاریخاگه از لاراول استفاده می‌کنید اصلا نیاز نیست کربن رو نصب کنید چون همونطور که گفتیم به صورت پیش‌فرض به همراه لاراول نصب میشه و در اختیار توسعه‌دهنده‌ها قرار میگیره و کافیه برای فراخوانی Carbon به روش زیر عمل کنیم: use Illuminate\Support\Carbon;طبق این Pull Reqest کد بالا اصل پکیج Carbon رو در یک نگه‌دارنده‌ای میپیچه که باعث میشه قابلیت macroable بودن به carbon در لاراول اضافه بشه. البته هنوز هم می‌تونید از پکیج کربن به صورت مستقیم استفاده کنید:use Carbon\Carbon;هرجا که نیاز داشته باشیم میتونیم ازش نمونه‌سازی کنیم:$current = new Carbon();
$newYear = new Carbon(&#039;first day of January 2024&#039;);توابع کمکی ()now و ()today در لاراول از کربن استفاده می‌کنند و البته می‌تونیم به صورت مستقیم یه سری از متدهای محبوب کربن رو به صورت استاتیک صدا بزنیم:$yesterday = Carbon::yesterday();
$today = Carbon::today();
$current = Carbon::now();
$londonCurrentTime= Carbon::now(&#039;Europe/London&#039;);
$tomorrow = Carbon::tomorrow();می‌تونیم برای متدهای بالا timezone تعیین کنیم ولی اگر اینکار رو نکنیم timezone پیشفرض UTC+0 در نظر گرفته میشه و اگه بخوایم براساس آرگومان‌های ورودی تاریخ و زمان ایجاد کنیم متد‌های استاتیک مخصوص این کار وجود دارند:Carbon::createFromDate($year, $month, $day, $tz); // ساخت تاریخ
Carbon::createMidnightDate($year, $month, $day, $tz); // ساخت تاریخ بر اساس زمان 00:00
Carbon::createFromTime($hour, $minute, $second, $tz); // ساخت زمان
Carbon::createFromTimeString(&amp;quot$hour:$minute:$second&amp;quot, $tz); // ساخت زمان براساس رشته
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz); // ساخت تاریخ و زمانمیتونیم آرگومان‌های بالا رو null ارسال کنیم و Carbon مشخصات زمانی همین الان رو برای اون آرگومان در نظر میگیره.به کمک استاتیک متد parse به صورت مستقیم زمانی رو برای کربن تعریف کنیم تا براساس اون یک شی Carbon بسازیم:$lastDayOfFeb2021 = Carbon::parse(&#039;last day of February 2021&#039;); یا حتی به کمک این متد می‌‌تونیم براساس timestamp ورودی یک شی Carbon درست کنیم:$lastDayOfFeb2021 = $Carbon::parse(1614470400);تغییر تاریخدریافت تاریخ تنها کاری نیست که می‌تونیم با پکیج کربن انجام بدیم، بلکه می‌تونیم با استفاده از این پکیج تاریخ مورد نظر رو تغییر هم بدیم.now()-&gt;addDays(3);
now()-&gt;subDays(3);حتما به این بخش از مستندات کربن برای دیدن لیست کامل متد‌هایی که برای تغییر تاریخ بهشون نیاز داریم سر بزنید.قسمتی از توابع برای تغییر تاریخ در کربناستفاده از Getters و Settersوقتی از پکیج carbon استفاده می‌کنیم دست ما به عنوان توسعه‌دهنده باز هست، یعنی میتونیم از هر روشی که برامون خوشایند هست استفاده کنیم تا خواسته رو برآورده کنیم. مثلا در کنار روش‌های بالا می‌تونیم برای خواندن و تغییر تاریخ از Getterها و Setterها استفاده کنیم.$datetime = Carbon::now();
$datetime-&gt;year = 2024;
echo $datetime-&gt;year;اگه روش بالا رو دوست ندارید هیچ اشکالی نداره، یه نگاه به روش پایین بندازید:$datetime = Carbon::now();
$datetime -&gt;year(2024);
echo $datetime -&gt;year();حتی می‌تونیم از این متدها به صورت زنجیری استفاده کنیم:$dt= Carbon::now();
$dt-&gt;year(2024)-&gt;month(1)-&gt;day(7)-&gt;hour(20)-&gt;minute(30)-&gt;second(40)-&gt;toDateTimeString();اگه حس می‌کنید که getterها و setterها جواب نیاز شما هستند حتما به قسمت مربوط به خودشون تو مستندات کربن نگاه بندازید. (getterها در کربن و setterها در کربن)تعیین فرمت خروجیاگه می‌خواید خروجی شما برای کاربرها مناسب باشه کربن متد‌هایی داره که کمک کننده هستند:$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
echo $dt-&gt;toDateString();                                    // 1975-12-25
echo $dt-&gt;toTimeString();                                  // 14:15:16
echo $dt-&gt;toDateTimeString();                          // 1975-12-25 14:15:16
echo $dt-&gt;toFormattedDateString();                 // Dec 25, 1975
echo $dt-&gt;toFormattedDayDateString();          // Thu, Dec 25, 1975
echo $dt-&gt;toDayDateTimeString();                   // Thu, Dec 25, 1975 2:15 PMاگه هیچکدوم از متدهای بالا خروجی مورد نظر شما رو تولید نمی‌کنند اصلا نگران نباشید چون هنوز متد ()format قابل استفاده هست.$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
echo $dt-&gt;format(&#039;l jS \\of F Y h:i:s A&#039;);         // Thursday 25th of December 1975 02:15:16 PMاگه براتون سوال پیش اومده که مقادیر داخل متد ()format از کجا اومدند حتما یه نگاه به این بخش از مستندات PHP برای تعیین فرمت تاریخ و زمان بندازید.محاسبه فاصله زمانیبا کربن می‌تونیم فاصله بین ۲ زمان رو در واحدی که می‌خوایم مثل روز یا ساعت اندازه‌گیری کنیم:$now = Carbon::now();
$future = Carbon::now()-&gt;addHours(6);
echo $now-&gt;diffInHours($future);خروجی کد بالا عدد 6 هست ولی بیاید با یک مثال جالب‌تر این موضوع رو ادامه بدیم:$dtToronto = Carbon::createMidnightDate(2021, 1, 1, &#039;America/Toronto&#039;);
$dtVancouver = Carbon::createMidnightDate(2021, 1, 1, &#039;America/Vancouver&#039;);
echo $dtToronto-&gt;diffInHours($dtVancouver); 
echo $dtVancouver-&gt;diffInHours($dtToronto); اگر به خروجی نیاز داشته باشیم که برای انسان‌ها واضح تر باشه اونوقت ()diffForHumans جواب کار ما هست:echo Carbon::now()-&gt;subDays(5)-&gt;diffForHumans();               // 5 days agoادغام در لاراولمهم‌ترین نکته برای ادغام پکیج کربن با فریمورک لاراول نحوه تبدیل مقدار تاریخی که در دیتابیس ذخیره شده به Object کربن هست که امروزه این کار در لاراول با کمک مفهوم casting خیلی راحت‌تر شد:class Post extends Model {
    protected $casts = [
        &#039;published_at&#039; =&gt; &#039;datetime&#039;,
    ];
}دقت کنید که ستون‌های created_at و updated_at در لاراول به صورت پیشفرض به Object کربن تبدیل میشن و ما کافیه به فکر ستون‌های دیگه باشیم که لازم هست به date یا datetime تبدیل بشن.سفر به اعماق لاراولبرای درک بهتر ادغام لاراول و کربن بهتره که به اعماق کدهای لاراول بریم، اما قبل از آن اگر به مستندات لاراول نگاه کنیم با ۲ تابع کمکی()now و ()tomorrow روبرو میشم. این توابع در اصل از Carbon استفاده می‌کنند و طبق چیزی که تو کدهای لاراول در مسیر Illuminate\Foundation\helpers.php می‌بینیم اونها Object کربن برگشت میدن:تعریف تابع ()now در فریمورک لاراولدر این تابع کلاس Date وجود داره که در ابتدای فایل فراخوانی شده:use Illuminate\Support\Facades\Date;و اگر به فایلی که Date در اون تعریف شده بریم می‌بینیم که کلاس اصلی براساس DEFAULT_FACADE در متد resolveFacadeInstance  تعیین شده که اسمش DateFactory هست.الان لازمه که وارد DateFactory در مسیر Illuminate/Support/DateFactory.php بشیم تا بفهمیم متد ()now چطور کار می‌کنه، اگه به طور کامل DateFactory رو بررسی کنیم میبینیم که هیچ متدی با نام()now اونجا وجود نداره بنابراین متدجادویی(Magic Method) ()call__ اجرا میشه.در ()call__ مقدارdateClass$ وجود داره که Illuminate\Support\Carbonدر اون تعریف شده و بررسی میشه که آیا متدی که دنبالش هستیم(مثلا ()now) در  Illuminate\Support\Carbon وجود داره یا اینکه به صورت macro تعیین شده و اگر متد مورد نظر ما وجود داشت فراخوانی و اجرا میشه.باتوجه به نتایج بدست اومده لازمه وارد فایل Illuminate/Support/Carbon.php بشیم و در اونجا می‌بینیم که این کلاس در واقع یک نگه‌دارنده برای کلاس والد خودش(کلاس Carbon) هست و اجازه میده که بتونیم کارهایی مثل تعریف macro انجام بدیم.محل اصلی ارث‌بری از Carbon در لاراولالان وارد پکیج کربن میشیم یعنی جایی که کلاس Carbon تعریف شده و اونجا می‌بینیم که کلاس Carbon از کلاس DateTime در PHP ارث‌بری کرده ولی اگه دقت کنید می‌بینید که هیچ متد دیگه‌ای وجود نداره و این سوال برای ما پیش میاد که واقعا بقیه متد‌ها کجا تعریف شدند؟تعریف کلاس Carbon در پکیج Carbonخب دنبال متدی مثل ()now در این فایل گشتیم و دیدیم که در این کلاس یک متد بیشتر وجود نداره و می‌دونیم که در کلاس DateTime هم متدی با نام ()now وجود نداره ولی اگر بیشتر دقت کنیم می‌بینیم که در این کلاس از trait با نام Date استفاده شده که امکان داره متدهای ما اونجا تعریف شده باشند.وارد trait مورد نظر خودمون یعنی Date میشیم و می‌بینیم که در اونجا هم تابع ()now وجود نداره ولی traitهای مختلفی در اون تعریف شدند که اسم یکی از اون trait ها Creator هست پس بهتره مستقیما واردش بشیم.تابع now در پکیج Carbonاینجا پایان مسیر شگفت‌انگیز ما هست یعنی جایی که متدهای مورد نظر ما مثل ()now یا ()today تعریف شدند.همونطور که متوجه شدیم کلاس Carbon\Carbon در لاراول توسط Illuminate\Support\Carbon پیچیده شده که قابلیت Macroable بودن رو به تاریخ و زمان در لاراول اضافه کرده. (pull request مربوط به این ویژگی)به انتهای مقاله رسیدیم و با ویژگی‌های اصلی پکیج Carbon آشنا شدیم و می‌تونیم تو اکثر پروژه‌ها با اطمینان خاطر ازش استفاده کنیم و درکنارش تونستیم با سفر به اعماق کربن و لاراول ادغامش با لاراول رو درک کنیم.از اونجایی که این پکیج بسیار غنی هست اصلا نباید از مستنداتش غافل شد و در جایگاه یک توسعه‌دهنده باید بتونیم برای نیازهای پروژه به مستندات سر بزنیم و نیاز مورد نظر رو از اونجا استخراج کنیم.</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>محمد مرکباتی</author>
                <pubDate>Sat, 10 Jun 2023 18:12:34 +0330</pubDate>
            </item>
                    <item>
                <title>چرخه حیات درخواست در لاراول به زبان ساده</title>
                <link>https://virgool.io/laravel-community/laravel-request-lifecycle-in-plain-language-yazvdpnf5x7s</link>
                <description>چرخه حیات درخواست در لاراولاعتماد به نفس بیشتری پیدا می‌کنیم اگر بدونیم ابزاری که استفاده می‌کنیم چطور کار می‌کنه، در واقع اگر نحوه عملکرد ابزاری رو متوجه بشیم  احساس راحتی و اطمینان بیشتری نسبت بهش داریم. شناخت چرخه حیات درخواست در لاراول قدم اول برای داشتن تجربه توسعه بهتر با این فریمورک هست، یعنی باید بدونیم چه پروسه‌ای اتفاق میفته از زمانی که درخواست ارسال میشه تا زمانی که پاسخ برگشت داده میشه.خلاصه چرخه حیات درخواست‌های HTTP در لاراول: درخواست به نقطه ورود هدایت میشه، از لاراول نمونه‌سازی میشه، عناصر حیاتی راه اندازی میشن، service providerها ثبت و اجرا میشن و درخواست به سیستم روتینگ می‌رسه و از اونجا به یک route یا controller ارسال می‌شه و پاسخی تولید میشه که باید به نقطه ورود برگرده.قدم اول: نقطه وروددرخواست از سمت مرورگر به وب‌سرور(Apache / Nginx) می‌رسه و اون وب‌سرور براساس پیکربندی‌ خودش این درخواست رو به نقطه ورود تمامی درخواست‌ها در لاراول، یعنی فایل public/index.php هدایت می‌کنه و بر این اساس میشه گفت که این فایل نقطه شروع کننده بارگذاری بقیه فریمورک هست.هدایت درخواست ورودی به نقطه شروع در لاراولهمینطور تو این قدم autoloader که توسط Composer ساخته شده داخلindex.php لود می‌شه:فراخوانی autoloader در لاراولو بعدش یک نمونه از اپلیکیشن لاراول از فایل bootstrap/app.php بازیابی می‌شه:بازیابی نمونه‌ای از  اپلیکیشن لاراول قدم دوم: هسته‌هادرخواست ورودی براساس جنسش به HTTP Kernel یا Console Kernel ارسال میشه، این هسته‌ها در واقع نقش نقطه مرکزی رو دارند که درخواست‌ها براساس جنسشون از اونها عبور می‌کنند.تشخیص هسته اصلی براساس جنس درخواست در لاراولاگر درخواست ورودی از جنس HTTP باشه، برای مثال از سمت مرورگر اومده باشه هسته اصلی app/Http/Kernel.php در نظر گرفته میشه.اگر درخواست ورودی از جنس Console باشه، برای مثال از سمت ترمینال اومده باشه هسته اصلی app/Console/Kernel.php در نظر گرفته میشه.درخواست‌ها در هسته به متد ()handle وارد میشن که به طور خلاصه کل کار این متد دریافت درخواست و برگشت دادن پاسخ هست.ورود درخواست به متد ()handle و دریافت پاسخ از آنبه طور خلاصه میتونیم هسته‌های لاراول رو تو یه جمله خلاصه کنیم:هسته‌ها را به عنوان یک جعبه سیاه بزرگ ببینید که کل برنامه شما را نشان می دهد.هسته‌ها از کلاس والد دیگه‌ای ارث‌بری می‌کنند که داخل اون کلاس‌ها آرایه‌ای با نام bootstrappers$ وجود داره که کلاس‌های مختلفی به منظور راه‌اندازی در آن تعریف شدند. این کلاس‌ها قبل از اجرا شدن درخواست ورودی اجرا میشن چون باید ویژگی‌های حیاتی فریمورک مثل تشخیص محیط برنامه را راه‌اندازی کنند. در واقع پیکربندی هرچیزی که باید تا قبل از هندل شدن درخواست اصلی انجام بشه مثل پیکربندی سیستم مدیریت خطا، تنظیمات، لاگینگ و لود کردن facadeها و service providerها در این قسمت انجام میشه. همچنین لیستی از middlewareها  فقط داخل هسته‌ی HTTP تعریف شدند که درخواست ورودی باید قبل از هندل شدن توسط برنامه از اونها عبور کنه.قدم سوم: Service Providersلود کردن service providerها یکی از مهمترین عملیاتی بود که در پروسه‌ی راه‌اندازی اجزای اصلی در قدم دوم اتفاق می‌افتاد، service providerها به نوع خودشون مسئول لود کردن قسمت‌ها مختلف  فریمورک لاراول مثل روتینگ و ایونت‌ هستند.تمامی service providerها در آرایه‌ای با نام providers$ داخل فایل config/app.php قرار دارند که با serviceProviderهای موجود در هسته ادغام می‌شوند و در این قدم  آرایه مربوطه توسط لاراول پیمایش میشه  و به ازای تمامی providerهای موجود از اونها نمونه سازی می‌کنه. بعد از نمونه‌سازی اولیه از service providerها اول متد register روی هر کدوم از اونها صدا زده می‌شه که باعث ثبت شدنشون میشه و بعدش متد bootروی هر کدوم از اونها صدا زده میشه.اساسا ویژگی‌های اصلی لاراول مثل روتینگ در قالب service providerها پیکربندی و ارائه میشن و با توجه به همین موضوع میشه گفت که عملیات مربوط به اجرای service providerها که از قدم دوم شروع میشه و تا قدم سوم ادامه پیدا می‌کنه جزو مهمترین عملیات در چرخه حیات یک درخواست هست.قدم چهارم: مسیریابییکی از مهم‌ترین providerها RouteServiceProvider هست که وقتی متد boot این provider اجرا میشه سیستم روتینگ هم راه اندازی میشه. در این مرحله درخواست ورودی به سیستم روتینگ میرسه و فایل‌های مربوط به مسیریابی مثل api.php و web.php که در پوشه routesهستند لود میشن و اگر درخواست از جنس HTTP باشه از middlewareهای مورد نیاز عبور میکنه و به یک route یا controller میرسه.در مسیر راه درخواست‌هایی که از جنس Console هستند middleware تعریف نشده، پس اونها مستقیما به command یا کلاس مورد نظر خودشون برای اجرا شدن میرسن.  قدم پنجم: اتمام ماجرااگر درخواست ما از جنس HTTP باشه سیستم روتینگ در نهایت درخواست‌ها رو به controller ارسال میکنه ولی می‌تونه با حذف controller خودش مستقیما پاسخ مناسب رو برگردونه، controller به محض دریافت درخواست می‌تونه اقداماتی مثل دریافت اطلاعات از دیتابیس یا اعتبار سنجی فرم انجام بده و در نهایت این اطلاعات رو برای پردازش به viewمناسب ارسال کنه تا در اونجا یک پاسخ مناسب برای نمایش در مرورگر کاربر ایجاد بشه.پاسخ برگشت داده شده این پتانسیل رو داره که از middleware ها عبور کنه که امکان ایجاد تغییرات در پاسخ رو فراهم می‌کنند. در ادامه، این پاسخ به متد()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()send در public/index.phpبرای نمایش در مرورگر وارد میشه.البته بازهم در نظر داشته باشید که اگر درخواست ما از جنس Console باشه در مسیر خودش با middleware روبرو نمیشه، پس در مسیر بازگشت هم همینطوری هست و پاسخ مورد نظر با middlewareها برخورد نداره و مستقیما به متد ()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()sendکه در public/index.php برای نمایش در ترمینال وارد میشه.تونستیم کنار هم دید کلی از نحوه کار لاراول رو بدست بیاریم و مطمئنا از این به بعد همه چیز در لاراول کمتر عجیب و جادویی به نظر می‌رسه و می‌تونیم با اطمینان و تسلط بیشتر به توسعه ایده‌ها بپردازیم.</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>محمد مرکباتی</author>
                <pubDate>Wed, 03 May 2023 21:01:21 +0330</pubDate>
            </item>
                    <item>
                <title>کاوش در PHP 8</title>
                <link>https://virgool.io/laravel-community/%DA%A9%D8%A7%D9%88%D8%B4-%D8%AF%D8%B1-php-8-hpexykp2qtbb</link>
                <description>بررسی نسخه هشتم PHP به همراه معرفی منابع یادگیری در این مقاله در مورد PHP 8 صحبت می‌کنیم. به نظرم مطالعه تاریخچه تغییرات در کنار معرفی منابع آموزشی این فرصت رو به ما می‌ده تا با چیزی عمیق تر آشنا بشیم و نسبت بهش تسلط بیشتری پیدا کنیم.تمام تلاشم رو کردم تا بتونم برای هر قسمت منابع مختلفی معرفی کنم ولی متاسفانه به‌خاطر قوانین ویرگول این کار شدنی نیست. برای همین تو نسخه فارسی این سری از مقالات نتونستم اینکار رو انجام بدم و به‌جاش در آخر یک‌سری منابع کلی معرفی کردم ولی اگر دوست دارید تمام منابع دسترسی داشته باشید لطفا نسخه انگلیسی این مقاله تو لینکدین یا مدیوم رو ببینید، اونجا برای هر قسمت منابع مناسبی رو معرفی کردم.بررسی *.۸.۰۱. پشتیبانی از Named Arguments: به کمک این ویژگی مشخص می‌کنیم که آرگومان ها بر اساس نام پارامتر به جای موقعیت پارامتر به یک تابع پاس داده بشند. برای درک بهتر لازمه تا مثالی ببینیم:array_fill(start_index: 0, count: 100, value: 50);۲. اضافه شدن Attributes: راهی برای اضافه کردن متادیتا برای کلاس‌ها، متدها، پراپرتی‌ها و توابع هستند و برای افزایش کیفیت کدها خوبه که ازش استفاده کنیم.۳. توانایی تعریف و تعیین پراپرتی‌ها در ورودی constructor:  روشی کوتاه برای این است که پارامترهای سازنده به یک ویژگی در سازنده تخصیص داده شوند. برای درک بهتر لازمه تا مثالی ببینیم:class User { 
    private string $name;
    public function __construct(string $name) {
        $this-&gt;name = $name; } 
}مثال بالا میتونه به روش پایین هم نوشته بشه:class User {
    public function __construct(private string $name) {}
}۴. پشتیبانی از Union Types: با کمک این ویژگی امکانی بوجود اومده تا بتونیم برای یک متغیر تایپ‌های قابل قبول مختلفی رو تعیین کنیم، برای درک بهتر لازمه تا مثالی ببینیم:class Example {
    private int|float $foo;
    public function squareAndAdd(float|int $bar): int|float {
        return $bar ** 2 + $foo; 
    }
}۵. پشتیبانی از match expression: مثل switch expression، برای بررسی یک مقدار به کار میره؛ در switch تمرکز روی مقدار هست(==) اما در match تمرکز بر مقدار و جنس اون متغیر(===) هست. برای یادگیری این مطلب میتونید منابع مختلف موجود مثل(این مطلب یا این مطلب) رو مطالعه کنید.۶. افزوده شدن قابلیت Nullsafe: با این قابلیت میتونیم به متد یا پراپرتی یک شی در صورتی که وجود داشته باشه دسترسی داشته باشیم ولی اگر وجود نداشته باشه null برگردونده میشه به جای Exception، برای درک بهتر لازمه تا مثالی ببینیم:$address = $customer-&gt;getAddress();
$country = $address ? $address-&gt;getCountry() : null;مثال بالا میتونه به روش پایین هم نوشته بشه:$country = $customer-&gt;getAddress()?-&gt;getCountry(); ۷. افزوده شدن WeakMap: کالکشنی از مجموعه‌ با جفت‌‌های Key/Value است که کلید آن باید یک شی باشد. ۸. افزوده شدن ValueError: نوع جدیدی از Error ها برای موقعی که نوع یک متغیر درست هست ولی مقدارش اشتباهه برای مثال پاس دادن یک عدد منفی به یک متغیر وقتی که متغیر انتظار عدد مثبت داشت.۹. تغییر رفتار برای فراخوانی متدهای همنام در trait ها: فرض کنید داخل یک trait تابعی دارید که با یک تابع از trait دیگه هم‌نام هست. شما این 2 تا trait رو باهم داخل یک کلاس فراخوانی کردید، تو این نسخه باید به صورت دستی مشخص کنید که منظور شما دقیقا کدوم trait هست یعنی به این صورت: T2::func  یا T1::func۱۰. استفاده از spaceship operator(&lt;=&gt;) در مرتب‌سازی:  برای مرتب کردن مقادیر استفاده از از عملگرspaceship operator (&lt;=&gt;) توصیه شده. برای درک بهتر لازمه تا مثالی ببینیم:// Old
usort($array, fn($a, $b) =&gt; $a &gt; $b);
// New
usort($array, fn($a, $b) =&gt; $a &lt;=&gt; $b);۱۱. پشتیبانی از mixed type: زمانیکه متغیر ما قابلیت پذیرفتن انواع مختلف مقادیر رو داره برای مشخص کردن type به جای نام‌بردن از تک تک type ها خوبه که از mixed استفاده می‌کنیم. باتوجه به مستندات PHP، در واقع mixed معادل union type به این نوع است: object|resource|array|string|int|float|bool|null۱۲. امکان تعیین static به‌عنوان نوع بازگشتی از متدها: در این نسخه این قابلیت وجود داره که بتوان مقدار static را از یک متد برگرداند، برای درک بهتر لازمه تا مثالی ببینیم:class Test {
    public function create(): static {
        return new static(); 
    }
}بررسی *.۸.۱۱. پشتیبانی از رشته‌ها به عنوان کلید‌ در unpack کردن آرایه:  هنگام unpack کردن یک آرایه (بازکردن آرایه با پیشوند &quot;…&quot;) امکان پشتیبانی از رشته‌ها به عنوان کلید‌ آن آرایه نیز وجود دارد، برای درک بهتر لازمه تا مثالی ببینیم:$arr1 = [1, &#039;a&#039; =&gt; &#039;b&#039;];
$arr2 = […$arr1, &#039;c&#039; =&gt; &#039;d&#039;]; //[1, &#039;a&#039; =&gt; &#039;b&#039;, &#039;c&#039; =&gt; &#039;d&#039;]۲. پشتیبانی از تعیین آرگومان‌های با نام پس از unpacking: ویژگی named argument از نسخه ۸ به PHP اضافه شده و در این نسخه امکانی وجود دارد تا پس از unpacking آرایه‌ها به عنوان ورودی یک تابع بتوان از named argument نیز استفاده کرد. برای درک بهتر لازمه تا مثالی ببینیم:function printNumbers(int $a, int $b, int $c) {
    echo $a.&#039; &#039;.$b.&#039; &#039;.$c;
}
printNumbers(...[5, 7], c: 9); // Output: 5 7 9۳. افزوده شدن Enumerations: مجموعه‌ای از چند آیتم مرتبط باهم به عنوان مقادیر محدود و مجاز برای یک چیز هستند. این ویژگی تو زبان‌های برنامه‌نویسی دیگه مثل Java هم وجود داره و پشتیبانی از اون در PHP یک اتفاق نسبتا بزرگ بوده.۴. افزوده شدن Fibers: در اصل، فیبر یک بلاکی از کد هست که استک (متغیرها و...) خودش رو حفظ می کنه و جدا از برنامه اصلی اجرا میشه.۵. افزوده شدن Intersection types: توسط این ویژگی میشه تعیین کرد تا متغیر تعیین شده توسط برنامه نویس به صورت همزمان  از چه نوع class یا interface هایی لازم است باشند. این برعکس Union Types هست که اجازه میده تا متغیر متعلق به یکی از type های اعلام شده توسط برنامه‌نویس باشه. برای درک بهتر لازمه تا مثالی ببینیم:function count_and_iterate(Iterator&amp;\Countable $value) {
    foreach($value as $val) {} 
    count($value);
}تو مثال بالا مقدار value$ باید به صورت همزمان از Iterator و Countable تاثیر گرفته باشه، وجود foreach نمایش تاثیرپذیری از Iterator و وجود ()count نمایش تاثیرپذیری از Countable هست.۶. افزوده شدن نوع بازگشتی never: این type به عنوان نوع خروجی در توابع یا متدهایی استفاده میشه که در صورت اجرای اونها برنامه متوقف میشه(استفاده از die، exit یا Exception). برای درک بهتر لازمه تا مثالی ببینیم:function redirect(string $url): never {
    header(&#039;Location: &#039; . $url); 
    exit();
}تفاوت void با never در این هست که never تضمین میکنه برنامه پس از اجرای این تکه کد برنامه متوقف میشه یا Exception ایجاد میشه و چیزی از این تابع برگردانده نمیشه(حتی ;return) ولی یکی از علائم void این هست که برنامه پس از اجرای تکه کد ادامه پیدا می‌کنه.۷. افزوده شدن کلمه کلیدی readonly: کلمه کلیدی که جلوگیری میکنه از تغییر مقدار یک پراپرتی پس از نمونه‌سازی اولیه. نمونه کد پایین این مسئله رو بهتر توضیح میده:class User {
    public readonly string $username;
    public function __construct(string $username) {
        $this-&gt;username = $username; 
    }
}

$user = new User(&#039;joe&#039;,&#039;secure&#039;);
$user-&gt;username = &#039;john&#039;;
// Fatal error: Uncaught Error: Cannot modify readonly property User::$usernameدر واقع بعد از نمونه‌سازی اولیه از کلاس User دیگه امکانی برای تغییر مقادیرش وجود نداره و همونطور که در کد نشون داده شده بعد از اقدام برای تغییر، Fatal Error نمایش داده میشه.۸. پشتیبانی از تعیین کلمه کلیدی final برای constant در class: از کلمه کلیدی final می‌توان برای تعیین اینکه مقدار ثابت و متد در کلاس غیرقابل تغییر باقی بماند استفاده کرد. با قرار دادن پیشوند final از تغییر یک متد یا ثابت توسط کلاس های فرزند جلوگیری می‌شود. اگر خود کلاس پیشوند final داشته باشد، نمی توان از آن ارث‌بری کرد.۹. افزوده شدن تابع ()array_is_list: تابعی که بررسی میکنه آیا آرایه ما یک list هست یا نه. یک آرایه زمانی list در نظر گرفته میشه که کلیدهای اون به صورت عددی و متوالی از صفر(۰) شروع بشن.۱۰. منسوخ شدن امکان تبدیل float به int: تبدیل ضمنی float به int که باعث از بین رفتن مقدار اعشاری میشه از این نسخه منسوخ شده. این روی کلیدهای آرایه، تعیین نوع int به عنوان مقدار ورودی یا خروجی و همینطور بر عملگرهایی که روی int کار میکنن تایر میذاره. نمونه کد پایین این مسئله رو بهتر توضیح میده:$a = [];
$a[15.5]; // deprecated, as key value loses the 0.5 component
$a[15.0]; // ok, as 15.0 == 15بررسی *.۸.۲۱. پشتیبانی از readonly class: این ویژگی باعث میشه تا تمام پراپرتی‌های موجود در کلاس ویژگی readonly دریافت کنند.class Post {
    public function __construct(
        public readonly string $title,
        public readonly Author $author,
        public readonly string $body,
        public readonly DateTime $publishedAt,
        ) {}
}مثال بالا میتونه به روش پایین هم نوشته بشه:readonly class Post {
    public function __construct(
        public string $title, 
        public Author $author,
        public string $body,
        public DateTime $publishedAt,
        ) {}
}در صورتی امکان ارث‌بری از کلاس های readonly وجود داره که کلاس فرزند هم دارای این ویژگی باشه.2. منسوخ شدن پراپرتی‌های داینامیک: استفاده از این ویژگی در این ورژن منسوخ شده و از نسخه ۹ زبان PHP استفاده از این ویژگی باعث ایجاد ErrorException میشه. در صورت استفاده از تکه کد زیر با پیامی در مورد منسوخ شدن این ویژگی مواجه میشیم.class Post {
}
// …
$post = new Post();
$post-&gt;name= &#039;Name&#039;;
var_dump($post-&gt;name); // &#039;Name&#039;
// Deprecated: Creation of dynamic property Post::$name is deprecatedدر نظر داشته باشید که هنوز هم می‌تونیم از ()get__ و ()set__ برای کار با مقادیر داینامیک استفاده کنیم، به مثال زیر توجه کنید:class Post {
    private array $properties = [];
    public function __set(string $name, mixed $value): void {
        $this-&gt;properties[$name] = $value;
    }
}
// …
$post-&gt;name = &#039;Name&#039;;اگه هنوز هم میخواید که از مقادیر داینامیک استفاده کنید ولی تمایلی به پیاده‌سازی ()get__ و ()set__ ندارید راه بهتری هم وجود داره و اون استفاده از یک attribute با عنوان AllowDynamicPropertiesدر PHP هست، به مثال زیر توجه کنید:#[AllowDynamicProperties]
class Post {
}
$post = new Post();
$post-&gt;name = &#039;Name&#039;; // All fine3. اضافه شدن اکستنشن Random: در این نسخه یک اکستنشن PHP جدید برای تولید عدد تصادفی اضافه شده است که مشکلات مربوط به توابع موجود رو برطرف میکنه. تمام کلاس‌های جدید معرفی شده در اکستنشن random تحت namespace با عنوان Random\ هستند. کلاس Random\Randomizer به منظور ایجاد یک API شی گرا برای دسترسی به تمام عملکردهای تولید اعداد تصادفی ارائه شده است، به مثال زیر توجه کنید:$r = new Random\Randomizer();
echo $r-&gt;getInt(1, 100);4. پشتیبانی از انواع برگشتی true، false و null:  از این نسخه امکان استفاده از مقادیر true false و null به عنوان نوع برگشتی یک تابع یا متد رو داریم. برای جلوگیری از افزونگی نمی‌تونیم از انواع true، false و bool در union type استفاده کنیم. به مثال زیر توجه کنید: function alwaysReturnsFalse(): false {}
function alwaysReturnsNull(): null {}
function alwaysReturnsTrue(): true {}5. پشتیبانی از DNF types: این ویژگی اجازه استفاده از union type و intersection type در کنار هم رو به توسعه‌دهنده میده. به مثال زیر توجه کنید:function generateSlug((HasTitle&amp;HasId)|null $post)  {
    if ($post === null) {
        return &#039;&#039;;
    }
return strtolower($post-&gt;getTitle()) . $post-&gt;getId();
}در صورت نوشتن مقادیری که در فرم DNF نباشن با parse error مواجه میشیم. به مثال زیر توجه کنید:A&amp;(B|D)
// Can be rewritten as (A&amp;B)|(A&amp;D) to avoid parse error
A|(B&amp;(D|W)|null)
// Can be rewritten as A|(B&amp;D)|(B&amp;W)|null to avoid parse error6. امکان تعیین constدر trait: از این نسخه توسعه‌دهنده‌ها امکان استفاده از constant در trait رو دارند و این constant ها میتونن همراه با final یا access modifier ها باشند، به مثال زیر توجه کنید:trait FooBar {
    const FOO = &#039;foo&#039;;
    private const BAR = &#039;bar&#039;;
    final const BAZ = &#039;baz&#039;;
    final protected const QUX = &#039;qux&#039;;
}

class Test {
    use FooBar;
}

echo Test::BAZ; // &#039;bar&#039;7. پشتیبانی و حفاظت از مقادیر حساس: یک روش معمول در هر کدبیسی ارسال خطاها به سرویسی هست که اونها رو ردیابی میکنه و در صورت بروز مشکل به توسعه دهندگان اطلاع میده. توجه کنید که این پیغام میتونه شامل مقدار واقعی اطلاعات حساس مثل متغیرهای محیطی، گذرواژه‌ها یا نام‌های کاربری باشه که امکان داره در پیام‌های خطا، گزارش‌های خطا، گزارش‌های برنامه‌ها و غیره ختم نمایش داده بشه که ناامن و بسیار نامطلوب است. از این نسخه امکانی به وجود اومده تا بشه چنین پارامترهای حساسی رو با attribute جدیدی با نام SensitiveParameter\ علامت گذاری کرد. هر پارامتری که به عنوان پارامترحساس علامت‌گذاری شده باشه در قسمت خطاها  نمایش داده نمیشه. بنابراین، می‌تونید اونها رو بدون نگرانی با سرویس‌های شخص ثالث برای ردیابی خطاها به اشتراک بگذارید.function login(
    string $user,
    #[\SensitiveParameter] string $password
) {
    // …
    throw new Exception(&#039;Error&#039;);
}
 
login(&#039;root&#039;, &#039;root&#039;);
 
Fatal error: Uncaught Exception: Error in login.php:8
Stack trace:
#0 login.php(11): login(&#039;root&#039;, Object(SensitiveParameterValue))
#1 {main}
  thrown in login.php on line 8با گوشه‌ای از ویژگی‌ها و تغییرات PHP 8 آشنا شدیم، خوشحال میشم که نظرات و پیشنهادات شما رو بدونم تا بتونم مطالب بهتری بنویسم. همونطور که گفتم بخاطر یکسری محدودیت‌ها نتونستم تمامی منابع رو معرفی کنم، لطفا برای دیدن منابع کامل لطفا به نسخه انگلیسی این مقاله تو لینکدین یا مدیوم سر بزنید، ولی اگر فرصت این‌کار رو ندارید این چندتا منبع رو داشته باشید.PHP TutorialProgram With GIO - PHP PlaylistPHP WatchStitcherتا زمانی که نسخه ۸ درحال توسعه باشه، این مقاله هم در حال کامل شدن هست و مطابق با ارائه نسخه جدید به‌روز میشه تا از آخرین تغییرات باخبر بشید.</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>محمد مرکباتی</author>
                <pubDate>Wed, 09 Nov 2022 20:33:49 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش استفاده از دستور rawValue در لاراول</title>
                <link>https://virgool.io/laravel-community/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1-rawvalue-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-awhlleoqqphc</link>
                <description>سلام دوستان من علیرضا احمدی هستم بیش از ۱۰ سال هست که در زمینه برنامه نویسی php فعالیت میکنم و معمولا هر چند وقت یکبار که فرصت میکنم تجربیات خودم رو در خصوص برنامه نویسی باز نشر میکنم آموزش استفاده از دستور rawValue در لاراولو حدودا ۴ سال پیش بود که جامعه توسعه دهندگان لاراول رو هم در ویرگول ایجاد کردم  https://virgool.io/laravel-community و شروع کردم به اشتراک گذاری تجربیات خودم و به مرور افراد زیادی در این راه بهم کمک کردند تا این که امروز کلی مطب در حوزه لاراول در ویرگول بازنشر کردیم و امروز جامعه توسعه دهندگان لاراول بیش از ۶۰۰ دنبال کننده دارد و صد ها نفر آموزش های خودشون رو بازنشر میکنند بعد از این کانال البته کانال تلگرام دورهمی برنامه نویسان رو هم در تلگرام ایجاد کردم : https://t.me/irdev2و خوب گروه تلگرامی مون هم امروز نزدیک به ۷۰۰ عضو دارد و برنامه نویسان حوزه های مختلف در آن حضور دارند شروع مون از اشتباهات رایج طراحی دیتابیس بود :یکی از بهترین آموزش هایی که ۳ سال پیش ایجاد کردم (اشتباهات رایج طراحی دیتابیس بود) https://virgool.io/laravel-community/%D8%A7%D8%B4%D8%AA%D8%A8%D8%A7%D9%87%D8%A7%D8%AA-%D8%B1%D8%A7%DB%8C%D8%AC-%D8%AF%D8%B1-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-hxmpvmwfr7fq و استقبال خیلی خوبی شد و خوب مدتی نرسیدم که واقعا ادامه بدهم تا امروز که واقعا باز هم دوست دارم در حوزه لاراول آموزش های بیشتری رو منتشر کنم آموزش استفاده از دستور rawValue در لاراول:اما بریم سراغ آموزش استفاده از دستور rawValue : قبل از نسخه 9.36.4 که این دستور وجود نداشت وقتی میخواستیم مثلا نام و ایمیل یک کاربر رو خروجی بگیریم از یه همچین کدی استفاده میکردیم :‌User::query()
    -&gt;select(DB::raw(&#039;CONCAT(`name`, &amp;quot &amp;quot, `email`) AS name&#039;))
    -&gt;where(&#039;id&#039;, 1)
-&gt;get();اما توی نسخه 9.36.4 یه متد جدید به الکوئنت اضافه شد به نام rawValue که میشه همین کد فوق رو ساده تر کرد User::query()
    -&gt;where(&#039;id&#039;, 1)
    -&gt;rawValue(&#039;CONCAT(`name`, &amp;quot &amp;quot, `email`)&#039;);دستورCONCAT یک تابع mysql است که به کمک اون در واقع من دارم نام و ایمیل کاربر رو به هم دیگه می چسبانم و خوب به جای CONCAT میشه خیلی دستورات دیگه هم استفاده کرد توی جزئیات این بروز رسانی v9.36.4 - 2022-10-20 :موارد زیر هم اضافه شده است که rawValue یکی از ویژگی هایی بود که من اون رو دوست داشتم - Added rawValue to Database Query Builder (and Eloquent as wrapper) (#44631)- Added TransactionCommitting (#44608)- Added dontIncludeSource to CliDumper and HtmlDumper (#44623)- Added Illuminate/Filesystem/FilesystemAdapter::checksum() (#44660)- Added handlers for silently discarded and missing attribute violations (#44664)توضیحات دقیق تغییرات انجام شده رو میتونید در لینک : https://github.com/laravel/framework/blob/9.x/CHANGELOG.mdمشاهده کنید ولی من برام rawValue جذاب بود به خاطر همین در موردش یک ویدیو هم تولید کردم و از یک زاویه دیگه هم این موضوع رو بررسی کردم لینک ویدیو این قسمت در اپارات :‌https://www.aparat.com/v/0xFJi?playlist=1843831مشاهده ویدیو :  https://www.aparat.com/v/0xFJi?playlist=1843831 و خوشحال میشم اگر هر نظر و یا پیشنهادی داشتید باهام به اشتراک بگذاریدتا یک آموزش دیگر براتون بهترین ها رو آرزو میکنم . </description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Fri, 28 Oct 2022 23:22:38 +0330</pubDate>
            </item>
                    <item>
                <title>کار کردن با فایل ها در فریم ورک لاراول</title>
                <link>https://virgool.io/laravel-community/%DA%A9%D8%A7%D8%B1-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A8%D8%A7-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-qofztnojbch2</link>
                <description>سلام و درود خدمت همه دوستان عزیزدر این قسمت در خصوص نحوه آپلود فایل در لاراول صحبت کردیم و این اولین قسمت از میکرونکته های لاراولی هست در ادامه همراه من باشیدکار کردن با فایل ها در فریم ورک لاراولمیکرو نکته های لاراولی یک مجموعه آموزشی برای لاراول هست که ما تقریبا هر چند وقت یکبار یک قسمت از اون رو منتشر خواهیم کرد و به یکسری از نکته های مهم لاراول اشاره میکنیم منبع اصلی این ویدیو سایت رسمی خود لاراول هست :‌laravel.com/docs/9.x/filesystemویدیوی این قسمت رو میتونید در زیر مشاهده کنید  https://www.aparat.com/v/K1IXk برخی از سرفصل های این آموزش :‌00:00 شروع۰۱:۰۷ برای آپلود فایل آیا نیاز به پکیج خاصی داریم ؟۰۲:۲۷ مدیریت فایل ها در لاراول۰۶:۳۰ :چطوری یک drive جدید برای اپلود فایل بسازیم ؟۰۸:۳۵ استفاده از فایل سیستم لاراول برای دیباگ کردن پروژه۱۱:۰۰ دریافت اطلاعات یک فایل در لاراول ۱۲:۳۰ استفاده از متد exists14:11 آموزش استفاده از متد missing۱۶:۱۵ آپلود فایل ها در یک سرور دیگر به وسیله FTP  و SFTP در لاراول۱۹:۰۰  معرفی متدهای copy و Moveامیدواریم که این قسمت برای شما دوستان عزیز مفید واقع بشه و خوشحال میشویم نظرات و پیشنهادات خودتون رو در کامنت ها برای ما بنویسد تا بتونیم مجموعه آموزش های بیشتری رو برای شما دوستان عزیز فراهم کنیم . گروه دورهمی برنامه نویسان در تلگرام :‌https://t.me/irdev2تقریبا تمامی رویداد ها و مطالب آموزشی مون در این کانال هم باز نشر میشه و همچنین برای پرسش و پاسخ میتونید از آن استفاده کنید . </description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Thu, 27 Oct 2022 01:39:11 +0330</pubDate>
            </item>
                    <item>
                <title>کارگاه مهارت سنجی برنامه نویسان</title>
                <link>https://virgool.io/laravel-community/%DA%A9%D8%A7%D8%B1%DA%AF%D8%A7%D9%87-%D9%85%D9%87%D8%A7%D8%B1%D8%AA-%D8%B3%D9%86%D8%AC%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-oovicohdcsqn</link>
                <description>سلام و درود خدمت همه دوستان و همراهان عزیز من علیرضا احمدی هستم بیش از ۱۰ ساله که برنامه نویسی php رو انجام میدهم در چند سال گذشته در کنار برنامه نویسی به عنوان مشاور فنی و یا مدیر فنی در خیلی از شرکت های بزرگ و کوچک حضور داشتم  و تقریبا هر شب ساعت ۲۱:۰۰ از طریق گروه تلگرامی :‌https://t.me/irdev2یکسری جلسات انتقال تجربه برای برنامه نویسان داریم امروز قرار بود که کارگاه مهارت سنجی برنامه نویسان با هزینه ۲۵۰.۰۰۰ تومان برگذار شود / ما تمام تلاش مون رو انجام میدهیم که که حال خوب رو به همه هديه با گفتگوی انجام شده با تیم راهبری این رویداد امروز رایگان برگذار خواهد شد دوستانی که هزینه ای رو پرداخت کرده بودند هزینه هاشون عودت داده خواهد شد این رویداد در گوگل میت به صورت انلاین برگذار می شود . https://lnkd.in/eTU_7nYDساعت و تاریخ :‌ پنج شنبه - ۲۸ مهر ۱۴۰۱ ساعت ۲۱ به وقت ایرانمدت زمان ۶۰ دقیقه خواهد بود سناریوی این جلسه :‌خودتون رو معرفی خواهید کرد / و به معرفی شما امتیاز ارائه خواهیم کرد و بعد از آن یکسری سئوال ها رو مطرح میکنیماین رویداد با هدف مهارت سنجی اولیه برنامه نویسان اجرا می شود که به برنامه نویسان کمک کنیم که مهارت خودشون رو بهتر معرفی نمایند . به جهت این که دورهمی امشب عمومی هست / باتوجه به حوزه ای که کار میکنید یکسری سئوال های عمومی رو مطرح خواهیم کرد . و به هر کدام از دوستان چند تا پیشنهاد هم ارائه خواهیم کرد . ❇️ تمامی رویداد های خودمون و رویداد های مشابه رو در کانال : ? https://t.me/t_eventمعرفی میکنیم / همچنین اگر شما هم رویداد خوبی رو می شناسید میتونید به ما معرفی کنید تا در گروه معرفی کنیم</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Thu, 20 Oct 2022 18:21:49 +0330</pubDate>
            </item>
                    <item>
                <title>مهم ترین نکات رزومه نویسی - بخش اول</title>
                <link>https://virgool.io/laravel-community/%D9%85%D9%87%D9%85-%D8%AA%D8%B1%DB%8C%D9%86-%D9%86%DA%A9%D8%A7%D8%AA-%D8%B1%D8%B2%D9%88%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-iqaskwxm5mca</link>
                <description>سلام دوستان امیدوارم حالتون خوب باشه امشب دوباره تصمیم گرفتم یک پست دیگه در مورد رزومه نویسی براتون منتشر کنم.من علیرضا احمدی هستم ادمین کانال تلگرام : معرفی بهترین کارجویان ایرانی :‌https://t.me/cv_usersاین کانال رو ایجاد کردم و به کارجو ها و کارفرما ها کمک میکنمبه کارجو ها کمک میکنم که رزومه بهتری رو بنویسند / تا به امروز به صدها نفر کمک کردم با این کار خودم هم کلی چیزای جدید یادگرفتم که قصد دارم تجربیاتم رو در اختیارتون قرار بدهم و به کارفرماها هم کمک میکنم که بهتر فردی که میخواهند رو پیدا کنند . مهم ترین نکات رزومه نویسی - بخش اول :اما در این پست قصد دارم به چند تا از نکات خیلی مهم که در زومه نویسی باید رعایت کنید اشاره کنم مقدمه :اول از همه چیز خودتون باشید / واقعا اگر زبان تون خوب نیست یکی از سئوالات همه اینه که رزومه رو به چه زبانی بنویسیم !‌/ اگر در ایران میخواهید بفرستید و انگلیسی تون خوب نیست !‌/ اصلا لزومی نداره که انگلیسی رزومه بسازید !‌۱)‌ باید خودتون و تخصص خودتون رو سریع معرفی کنید شما فقط ۱۰ ثانیه وقت دارید که در نگاه اول توجه کارفرما / منابع انسانی و... رو جلب کنیدپس بهتر در ابتدای رزومه از داستان نویسی خود داری کنید و خودتون و تخصص تون رو در ابتدا مختصر و مفید معرفی کنید - یک نمونه : من علیرضا احمدی هستم بیش از ۱۰ ساله که دارم برنامه نویسی php انجام می دهم , در این سال ها با شرکت های کوچک و بزرگ زیادی کار کردم در حال حاظر در کنار برنامه نویسی  به عنوان مشاور فنی یا مدیر فنی در تیم های برنامه نویسی حضور دارم و به تیم های برنامه نویسی برای حل بهتر مسائلشون کمک میکنم .... تازه روی این متن میشه خیلی بیشتر کارکرد و حتی خلاصه تر هم کرد اما یک نمونه اشتباه : من علیرضا احمدی هستم/ ۲۷ سالمه / از ۱۰ سالگی وارد دنیای کامپیوتر شدم/  اولین کامپیوترم رو از نمایشگاه کتاب خریدم / ۲ هفته نشده بود اون رو سوزندم / بعد تا ۶ ماه درگیر پول جمع کردن برای کامپیوتر بعدی بودم و.... این معرفی من نیست !‌این داستان من هست با این مدل بخواهم خودم رو معرفی کنم و این ۱۷ سال رو بخواهم توضیح بدهم خوب حداقل ۱۰ صفحه نیاز داره و تو فاز اول اصلا دیگه این مدل معرفی جواب نمیده ۲)‌ رزومه - CV نیست !رزومه CV نیست و حتی کاتالوگ هم نیست / و جای نوشتن داستان هم نیست رزومه متنی برای معرفی کوتاه و مختصر از شما هست که حداکثر بهتر ۲ صفحه باشه اگر ۱۰ ثانیه اول رو موفق بوده باشید / ۳۰ ثانیه دیگه وقت دارید تا نظر (کارفرما - منابع انسانی و...  ) رو ادامه بیشتر جلب کنید تا رزومه شما منجر به مصاحبه شود ... ۳) در جای مناسبی در ابتدای رزومه راه های ارتباطی تون رو قرار بدید :بعد از معرفی کوتاه از خودتون باید با یک فونت مناسب یکسری راه های ارتباطی از خودتون رو قرار بدید۴) مهم ترین بخشی که بعد از معرفی خودتون باید وجود داشته باشه / مهارت های شما هستدر مورد مهارت های خودتون صادقانه بنویسید !‌در ابتدا مهارت های اصلی خودتون رو قرار بدید به عنوان مثال مهارت اصلی من برنامه نویسی php هست ولی این تنها مهارت من نیست به عنوان یک ایده اگر مهارت هایی که میخواهید بگید زیاد هست میتونید مهارت هاتون رو دسته بندی کنیدمهارت های مهم تون رو Bold کنید / رنگش رو عوض کنید یا دورش کادری رو مشخص کنید که در نهایت در کنار مهارت های دیگه اتون بیشتر دیده بشه ۵) بخش بعدی - اختیاری : مهارت های شما مثل ابزار هستند / من در مورد خودم میگم :من در کنار مهارت هام همیشه ۵ تا از خدماتی که میتونم به اون شرکت رو هم ارائه دهم می نویسم مثلا می نویسم در زمینه بهبود امنیت اسکریپت های php / بهینه سازی اسکریپت های php / طراحی دیتابیس برای اسکریپت های php هم میتونم به شما کمک کنم . ۶) رزومه پایه و رزومه اختصاصی برای شرکت ها !‌</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Thu, 20 Oct 2022 09:27:56 +0330</pubDate>
            </item>
                    <item>
                <title>? چگونه یک شرکت خوب پیدا کنیم ؟</title>
                <link>https://virgool.io/laravel-community/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%B4%D8%B1%DA%A9%D8%AA-%D8%AE%D9%88%D8%A8-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D9%86%DB%8C%D9%85-kcoahpommjsk</link>
                <description>چگونه یک شرکت خوب پیدا کنیم ؟یکی از سئوالاتی که خیلی ها ازم می پرسند اینه که چطوری میتونیم از توی جابینجا یا جاهای مشابه شرکت های خوب رو پیدا کنیماول از همه تعریف خوب یا بد یک تعرف نسبی هست :بیایید برای خودتون شفاف کنید که برای شما چه شرکتی خوب هست / شرکت خوب برای هر فردی متفاوت هستمثلا برای من شرکتی خوبه که تعامل باهام داره/ بخشيش دورکاری هست و بخشيش حضوری هستبرای یکی ممکن شرکتی خوب باشه که کاملا حضوری باشهصنعت :شرکت خوب در صنعت های مختلف تعریف های متفاوتی رو داره !مثلا شرکت خوب توی حوزه طراحی سایت / شرکتی که حداقل یکم هم وقت میزاره برای اموزش پرسنلش که ارتقا داشته باشند / و تمرکزش روی ساخت محصولات خوب هستالبته باز این خوب بودن ها باز هم برای هر فرد متفاوت هست ولی میخواهم بگم توی صنعت های مختلف یکمی این خوب بودن متفاوت هستاما خوب برای خودمون این تعریف ها رو پیدا کردیم / چطوری شرکت های خوب رو یپدا کنیم :فقط یکی از راه های استخدام شدن و گرفتن پروژه سایت هایی مثل جابینجا هستصنایعی که وضع خوبی رو دارند میتونید شناسایی کنید و شرکت هاش رو پیدا کنید و تحقیق کنیدو بعد اقدام به ارسال رزومه کنید / مستقیم برید سراغشونهمچنین ویدیوی این قسمت رو میتونید از طریق لینک زیر مشاهده کنید :‌http://www.aparat.com/v/pxdzqتمامی این رویداد ها در کانال دورهمی برنامه نویسان برگذار میشه : لیست برخی از رویداد های هفته پایانی مهر ماه ۱۴۰۱تمامی رویداد های زیر رایگان می باشد و در کانال دورهمی برنامه نویسان به آدرس :https://t.me/irdev2برگذار می شودشنبه - ۲۳ مهر ۱۴۰۱ =&gt; چگونه یک شرکت خوب پیدا کنیم ؟یکشنبه ۲۴ مهرماه ۱۴۰۱ =&gt; گرفتن پروژه خارج از ایراندوشنبه ۲۵ مهر ماه ۱۴۰۱ =&gt; محيط کار برای برنامه نویسانسه شنبه - ۲۶ مهر ۱۴۰۱ =&gt; دورهمی برنامه نویسان بک اندچهارشنبه ۲۷ مهر ۱۴۰۱ =&gt; دورهمی برنامه نویسان فرانت اندپنجشنبه ۲۸ مهر ۱۴۰۱ =&gt; چطوری پروژه خارج از ایران بگیریمبرای مشاهده لیست کامل رویداد ها میتوانید به صفحه :https://alirezap30web.ir/programming-events/مراجعه فرمایید</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Sat, 15 Oct 2022 23:52:19 +0330</pubDate>
            </item>
                    <item>
                <title>درک عمیق‌تر Service Container و Service Provider در لاراول</title>
                <link>https://virgool.io/laravel-community/%D8%AF%D8%B1%DA%A9-%D8%B9%D9%85%DB%8C%D9%82-%D8%AA%D8%B1-service-container-%D9%88-service-provider-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-e0x79s8ckovl</link>
                <description>اول از همه باید بدونیم که تمامی مفاهیم زیر به یک معنا هستند:Service ContainerDependency Injection Container (DI)Inversion of Control Container (IoC)Application Containerدر واقع Service Container لاراول یکی از مهم‌ترین بخش‌های این فریمورکه که کمتر بهش توجه میشه، ۲ دلیل مهم برای این کم توجهی Developerها اینه:۱- بعضی‌ها فکر می‌کنند که درک DI سخته، پس بهتره که بیخیال مفهوم IoC و IoC container بشیم.۲- درکی از این ندارن که آیا قراره از container استفاده کنند یا خیر (در واقع ما همیشه داریم از این‌ها استفاده می‌کنیم؛ چرا که سنگ بنای لاراول روی Service Container بنا شده).تزریق وابستگی (Dependency Injection) و IoC:یک تعریف خیلی ساده از DI اینه: فرآیند پاس دادن وابستگی‌های یک کلاس به شکل آرگومان(هایی) به یکی از متدهای اون کلاس (معمولا setter یا constructor).کد زیر، نمونه‌ای از کدی هست که توش DI رعایت نشده و فراخوانی کلاس پایه داخل کلاس سطح بالاتر اتفاق افتاده:متد share مربوط به کلاس TwitterService می‌تونه یک چنین چیزی باشه:توی کد بالا، داخل سازندهٔ کلاس Publication یک شی جدید از کلاس TwitterService ایجاد شده و به عبارتی کلاس Publication حالا به کلاس توییتر سرویس وابسته شده، به جای اینکه این کلاس رو داخل بدنهٔ سازنده فراخوانی کنیم؛ می‌تونیم شی‌ای از این کلاس رو به صورت یک آرگومان به سازندهٔ Publication پاس بدیم:برای درک بهتر قطعه کدهای بالا، داخل web route میاییم و می‌گیم که هر وقت وارد uri روت یا / شدیم؛ یک توییت ارسال کن:این ساده‌ترین حالتی بود که میشد DI رو پیاده‌سازی کرد؛ اعمال کردن DI به یک کلاس باعث IoC یا وارونگی کنترل میشه، یعنی کلاس سطح بالاتر (اینجا Publication) دیگه وابسته به کلاس سطح پایین‌تر (اینجا TwitterService) نیست. قبل از اعمال DI، کلاس وابسته (Publication) در کنترل یک وابستگی سطح پایین‌تر بود. اما با اعمال DI، کنترل این پروسه به فریمورک واگذار شد.IoC Containerدر بخش قبل دیدیم که چطور میشه با استفاده از DI کنترل نمونه‌سازی (ساخت یک شی از یک کلاس) رو تحت کنترل فریمورک در آورد و وابستگی بین دو کلاس سطح بالاتر و پایین‌تر رو حذف کرد.با استفاده از IoC Container میشه پروسهٔ DI رو خیلی ساده تر کرد. قطعه کد زیر یک کلاسه که می‌تونه دیتایی که می‌خوایم رو ذخیره و در وقت نیاز بازیابی کنه (به ما برگردونه). یک نمونهٔ خیلی ساده از IoC Container می‌تونه به شکل زیر پیاده‌سازی بشه:اسم این کلاس رو گذاشتیم Container، چرا؟ چون مثل یک کانتینر یا ظرفی هست که میشه توش وابستگی‌ها رو تعریف کرد.ما می‌تونیم هر دیتایی که دلمون خواست رو توی این کانتینر bind کنیم؛ متد bind دو تا آرگومان می‌گیره، کلید و مقدار، کلید و مقدار توی یک آرایه به اسم bindings ذخیره میشن و وقتی قرار باشه که ازشون استفاده کنیم کافیه کلید رو به متد make پاس بدیم تا اگر مقدار متناظرش یک تابع بود؛ اون رو رن کنه و اگر غیر اون بود، مقدار درخواستی رو برگردونه.برای درک بهتر کلاس بالا، ازش توی web route استفاده می‌کنیم:توی مثال بالا، اول یک شی از کلاس Container یا در واقع همون IoC Container خودمون ساختیم؛ بعدش با استفاده از متد bind یک key value رو جفت کردیم (در واقع داخل آرایهٔ bindings ذخیره کردیم)؛ حالا که به اون مقدار نیاز پیدا کردیم؛ کافیه key رو به متد make این کلاس پاس بدیم.حالا خیلی راحت می‌تونیم با استفاده از یک callback function یک کلاس رو به IoC Container بایند کنیم؛ این callback function میاد و یک شی از کلاسی که بهش دادیم ایجاد می‌کنه و مسیر کامل کلاس (namespace) رو هم به عنوان کلید داخل bindings ذخیره می‌کنه.مثلا توی قطعه کد بالا، کلید ما TwitterService::class هست که معادلش میشه App\Service\TwitterService (به شکل رشته).حالا بیایین فرض کنیم که کلاس TwitterService نیاز به یک کلید API داره تا بتونه اهراز هویت رو انجام بده و بعدش توییت رو ارسال کنه؛ توی این حالت می‌تونیم کلاسمون رو به شکل زیر پیاده‌سازی کنیم:چند نکتهٔ مهم در مورد قطعه کد بالا:۱- یک شی از کلاس Container ایجاد کردیم.۲- کلید API رو با متد bind به container متصل کردیم.۳- اینجا مهمه: کلاس TwitterService رو به عنوان کلید در نظر گرفتیم و آرگومان دوم یک closure function هست که توش از use استفاده شده! خب این دیگه چه جور syntaxای هست؟یک closure در واقعی تابعی هست که می‌تونیم اون رو به یک متغیر نسبت بدیم.یک closure یک namespace جدا محسوب میشه، بنابراین به طور معمول امکان دسترسی به متغیرهایی که بیرون این عبارت تعریف شدن وجود نداره و باید از کلمهٔ کلیدی use برای دسترسی به اون مقادیر خارج از فضای نام استفاده کرد.وقتی که ما یک دیتا رو به container بایند می‌کنیم؛ هر زمان که بهش نیاز داشته باشیم می‌تونیم صداش بزنیم بدون اینکه نیاز باشه تا همیشه از new استفاده کنیم؛ در واقع ما با استفاده از IoC Container فقط یک بار از new استفاده می‌کنیم.به خودی خود استفاد چند باره از new بد نیست؛ اما این رو باید در نظر گرفت با هر بار صدا زدن new ما باید وابستگی‌های اون کلاسی که داریم ازش یک نمونه (instant) ایجاد می‌کنیم رو بهش بدیم که نیاز به دقت داره و به مرور زمان حوصله‌سر بر و تکراری میشه. اما با IoC Container دیگه نیاز نیست نگران باشیم؛ چرا که container مراقبت تزریق وابستگی های ما خواهد بود.یک IoC Container کد ما رو خیلی زیاد منعطف می‌کنه. وضعیتی رو فرض کنید که قرار باشه کلاس TwitterService رو با یک کلاس دیگه (برای پست کردن مطلب توی یک سایت دیگه به غیر از توییتر) عوض کنیم؛ مثلا LinkedInService؛ حالا تکلیف چیه؟ کدهایی که بالا نوشتیم اصلا برای یک چنین سناریویی مناسب نیستن؛ برای جایگزین کردن کلاس TwitterService باید یک کلاس جدید ایجاد و به container متصلش کنیم؛ و تمامی مرجع‌ها به کلاس قبلی رو جایگزین کنیم.اما کافیه که بریم سراغ interface ها توی php تا این مشکل رو حل کنیم و به راحتی سرویس‌های مختلف یا درایورهای مختلف رو عوض کنیم؛ به جای اینکه مجبور به بازنویسی مجدد کدها باشیم. برای حل معضل بالا، کافیه یک interface به اسم SocialMediaServiceInterface ایجاد کنیم:حالا می‌تونیم کلاس TwitterService خودمون که اینترفیس SocialMediaServiceInterface رو implement می‌کنه پیاده‌سازی کنیم:***نکته: داخل interface نمیشه property تعریف کرد و فقط مجاز به تعریف تابع هستیم.یک اصلاح مهم: concrete class یعنی کلاسی که یک interface رو implement می‌کنه. این کلاس باید تمامی متدهای تعریف شده داخل اینترفیس رو پیاده‌سازی کنه.خب حالا ما باید به جای کلاسی که interface رو implement کرده خود interface رو به container بایند کنیم. توی callback یک شی از کلاس TwitterService رو به شکل قبلی برمی‌گردونیم.کد بالا دقیقا مثل کد قبلی که بدون اینترفیس بود؛ کار می‌کنه. ماجرا از جایی جالب میشه که ما قراره از LinkedIn به جای توییتر استفاده کنیم. به لطف وجود interface این کار رو میشه تو ۲ مرحلهٔ ساده انجام داد:۱- پیاده‌سازی کلاس LinkedInService که اینترفیس رو implement می‌کنه:۲- آپدیت کردن فراخوانی TwitterService با LinkedInService توی آرگومان دوم bind:حالا ما یک شی از کلاس LinkedInService داریم که به container بایند شده. زیبایی این روش اینکه که تمامی کدهای قبلی ما سر جای خودشون هستن و با یک تغییر کوچیک درایور شبکه اجتماعی رو عوض کردیم. تا زمانی که یک کلاس اینترفیس SocialMediaServiceInterface رو implement کنه، می‌تونه به عنوان یک سرویس معتبر شبکهٔ اجتماعی به کانتینر bind بشه.مبحث Service Container و Service Provider:لاراول با یک IoC Container خیلی قوی‌تری نسبت به پیاده‌سازی سادهٔ ما (کلاس Container) ارائه میشه. اسم IoC Container لاراول Service Container هست؛ پس عملا Service Container یا موارد زیر فرقی با هم ندارند و فقط یک اسم هستن:DI ContainerIoC ContainerApplication ContainerService Containerاگر بخوایم از IoC Container لاراول به جای IoCC خودمون (کلاس Container) استفاده کنیم؛ باید به شکل زیر عمل کنیم؛ شکل بازنویسی شده کدهای ما اینطوریه:توی هر برنامهٔ لاراولی app در واقع نمونه‌ای از container ما هست. در واقع این helper function میاد و یک شی یا نمونه از Service Container (اسم لاراول برای IoC Container خودش) برمی‌گردونه.دقیقا مثل container سفارشی و ساده که خودمون توسعه دادیم؛ Service Container لاراول یک متد bind و make داره که برای اتصال و دسترسی به سرویس‌ها کاربرد داره.این کانتینر لاراول (Service Container) یک متد دیگه هم داره به اسم singleton که در واقع اشاره داره به design pattern معروف سینگلتون؛ وقتی یک کلاسی رو به عنوان singleton به کانتینر بایند می‌کنیم؛ در این صورت تنها و تنها یک شی از اون کلاس در هر درخواست ایجاد میشه.برای درک تفاوت bind و singleton bind بهتره که نگاهی به کدهای زیر بندازیم:توی قطعه کد بالا، به Service Container لاراول (app) گفتیم که ۲ تا شی برای ما make کنه؛ دقت داشته باشید که این کلاس به صورت ساده به container بایند شده؛ مقادیر برگشتی ۲۶۲ و ۲۶۹ نشون میده که instanceهای متفاوتی ایجاد شده، اما اگر کلاس رو به شکل singleton بایند کنیم؛ نتیجه متفاوت خواهد بود:حالا برای هر دو تا instance که گفتیم make بشه؛ فقط یک عدد (۲۶۲) برگشت داده شده و این نشون میده که بایند کردن کلاس به شکل singleton باعث میشه که فقط و فقط یک شی از اون کلاس ایجاد بشه.مبحث Service Provider:حالا که با Service Container لاراول، تابع کمکی app و متدهای bind singleton و make آشنا شدیم؛ حالا وقتشه که یاد بگیریم؛ این متدها رو کجا فراخوانی کنیم؟! مطمئنا نمی‌تونیم از کنترلرها و مدل‌ها برای این کار (فراخوانی این متدها) استفاده کنیم.محل درست برای قرار دادن binding ها Service Provider هست؛ Service Providerها در واقع کلاس‌هایی هستند که داخل پوشهٔ app/Providers قرار گرفتن و ما می‌تونیم SPهای سفارشی خودمون رو هم ایجاد کنیم. SP ها در واقع زیربنا و چارچوب فریمورک لاراول هستن؛ این کلاس ها مسئول راه‌اندازی اکثر سرویس‌هایی هستن که فریمورک ارائه میده.هر پروژهٔ جدید با ۵ Service Provider به شکل default ارائه میشه. بین این‌ها، کلاس AppServiceProvider به شکل خالی ارائه به همراه ۲ متد boot و register ارائه میشه. متد register برای ثبت سرویس‌های جدید برای application استفاده میشه؛ این متد جایی هست که ما عملیات binding رو انجام می‌دیم:داخل Service Providerها ما با استفاده از this به app دسترسی داریم و نیازی نیست که که تابع کمکی app استفاده کنیم؛ چرا که هر Provider وارث ServiceProvider هست پس میشه بهش دسترسی داشت.متد boot برای منطق مورد نیاز برای راه‌اندازی سرویس‌های ثبت شده به کار میره. یک مثال خوب برای درک این قضیه کلاس BroadcastingServiceProvider هست که به شکل دیفالت با هر پروژهٔ لاراولی نصب میشه:همون‌طور که می‌بینید؛ متد boot میاد و متد routes از فساد Broadcast رو صدا می‌زنه و همین‌طور فایل routes/channels.php رو require می‌کنه؛ با این کار مسیرهای broadcasting رو توی این پروسه فعال می‌کنه.برای یک یا دو binding ساده، مثل چیزی که خودمون پیاده‌سازی کردیم؛ استفاده از کلاس AppServiceProvider منطقی به نظر می‌رسه؛ اما برای سرویس‌هایی که نیاز به منطق پیچیده‌تری برای اجرا شدن دارن، ما باید یک Provider جدید ایجاد کنیم:artisan make:provider &lt;provider name&gt;تصویر کامل!توی بخش‌های قبلی مفاهیم مختلف زیر رو یاد گرفتیم:۱- تزریق وابستگی (DI)۲- اصل وارونگی کنترل (IoC)۳- Service Container۴- Service Providersتوی این بخش، تمامی مفاهیم بالا رو کنار هم قرار می‌دیم تا به یک تصویر کامل و جامع از عملکرد اون‌ها دست پیدا کنیم.دوباره برمی‌گردیم سراغ کلاس Publication که اوایل این آموزش باهاش کار کرده بودیم. اگر به خاطر داشته باشید کلاس Publication به کلاس TwitterService وابسته بود. اما با سرکار اومدن interfaceها، بهتره که کدهای قبلی رو آپدیت کنیم و به جای کلاس TwitterService اینترفیس این کلاس رو بهش پاس بدیم:حالا کلاس Publication عوض اینکه وابسته به یک کلاس خاص باشه؛ می‌تونه هر نوع کلاسی که اینترفیس SocialMediaServiceInterface رو implement کرده؛ به عنوان آگومان ورودی دریافت کنه. قبل از این ما اینترفیس SocialMediaServiceInterface رو داخل Service Provider به کلاس LinkedInService که SocialMediaServiceInterface رو implement کرده بود bind کردیم؛ بنابراین با اجرای کد زیر؛ انتظار میره که یک شی از کلاس LinkedInService برگشت داده بشه:app()-&gt;make(SocialMediaServiceInterface::class);اما یک کلاسی که هنوز به Service Container لاراول bind نشده؛ خود کلاس Publication هست؛ اما اگر بیاییم و بدون bind کردن مستقیم کد زیر رو ران کنیم؛ چه اتفاقی می‌افته؟app()-&gt;make(Publication::class);می‌بینیم که به شکل عجیبی بدون bind کردن این کلاس؛ یک شی ازش ایجاد شد! توی نگاه اول این اتفاق عجیب و شبیه جادو هست؛ اما در واقع این اتفاق نتیجهٔ در کنار هم قرار گرفتن تمامی مفاهیمی هست که پیش از این گفتیم.زمانی که لاراول به خط زیر می‌رسه:app()-&gt;make(Publication::class);میره دنبال مقدار متناظر با این کلید داخل Service Container؛ اما وقتی کلید رو پیدا نمی‌کنه؛ میره و یه نگاه می‌ندازه به constructor تا ببینه که این کلاس چه ورودی(هایی) می‌گیره:لاراول متوجه میشه که کلاس Publication یک ورودی می‌گیره به اسم $socialMediaService که نوعش (که با type hint مشخص شده) SocialMediaServiceInterface اینه؛ بنابراین میره داخل Service Container و دنبال کلیدی می‌گرده که از این interface باشه؛ حالا لاراول وقتی که کلید SocialMediaServiceInterface::class رو پیدا کرد؛ یک شی از نوع LinkedInService برمی‌گردونه:الان باید برای شما مشخص شده باشه که لاراول می‌تونه به صورت اتوماتیک یک شی از وابستگی‌هایی که مجهز به Type Hint هستن (قبل از اسم متغیر نوع اون هم مشخص شده)؛ ایجاد کنه (تا زمانی که اون وابستگی ها هیچ interfaceای رو implement نکرده باشن).حالا می تونیم routes/web.php رو به شکل زیر آپدیت کنیم:حالا پروژه داره خیلی راحت کار می‌کنه؛ همون‌طور که می‌بینید؛ مطابق قابلیت تفکیک اتوماتیک container شما خیلی به ندرت به شکل دستی یک شی از container بیرون می‌کشید! تا زمانی که شما interfaceها رو به شکل مناسب bind می‌کنید و برای نیازمندها و وابستگی ها type hint قرار می دید؛ لاراول کارهای دشوار رو برای شما به صورت اتوماتیک انجام میده.منبع: farhan.dev (مطلب اصلی از این سایته؛ اما گاهی نکاتی از stackoverflow و... هم اضافه شده)</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>عارف</author>
                <pubDate>Thu, 06 Oct 2022 23:17:25 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه فارسی سازی slug در لاراول با پکیج cviebrock/eloquent-sluggable</title>
                <link>https://virgool.io/laravel-community/%D9%86%D8%AD%D9%88%D9%87-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-slug-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D8%A7-%D9%BE%DA%A9%DB%8C%D8%AC-cviebrockeloquent-sluggable-ya2kxk3cces9</link>
                <description>سلام دوستان، توی این پست کوتاه قصد دارم به شما نحوه استفاده از پکیج cviebrock/eloquent-sluggable یاد بدم.نحوه فارسی سازی slug در لاراول با پکیج cviebrock/eloquent-sluggableبه ترتیب باید کار های زیر انجام بدید.قدم اول:  ابتدا باید پکیج بوسیله کامپوزر نصب کنید. پس کد زیر توی ترمینال اجرا کنید. composer require cviebrock/eloquent-sluggable https://virgool.io/p/ya2kxk3cces9/composerrequirecviebrock/eloquent-sluggable php artisan vendor:publish --provider=&amp;quotCviebrock\EloquentSluggable\ServiceProvider&amp;quotقدم سوم: پکیج توی فایل مدل مورد نظر اضافه کنید. من کد کاملشو براتون میزارم.use Cviebrock\EloquentSluggable\Sluggable; 
class Post extends Model { 
     use Sluggable;

     public function sluggable(): array {
          return [ &#039;slug&#039; =&gt; [ &#039;source&#039; =&gt; &#039;name&#039; ] ];
      } 

اینا هم کدهای اضافی که مربوط به خودتونه. اینارو گذاشتم بخاطر اینکه برای برخی از دوستان که شاید نامشخص باشه که دقیقا بدونن باید کجا بزارن.

     protected $table = &#039;post&#039;; 
     protected $fillable = [&#039;user_id&#039;, &#039;name&#039;, &#039;description&#039;]; 
}قدم چهارم: بخاطر اینکه آدرس ما فارسی پشتیبانی کنه باید فایل sluggable.php توی دایرکتوری config باز کنیم و کد زیر به جای &#x27;method&#x27; =&gt; null, قرار بدیم.&#039;method&#039; =&gt; function($string, $separator = &#039;-&#039;) {
$_transliteration = array(
&#039;/ä|æ|ǽ/&#039; =&gt; &#039;ae&#039;,
&#039;/ö|œ/&#039; =&gt; &#039;oe&#039;,
&#039;/ü/&#039; =&gt; &#039;ue&#039;,
&#039;/Ä/&#039; =&gt; &#039;Ae&#039;,
&#039;/Ü/&#039; =&gt; &#039;Ue&#039;,
&#039;/Ö/&#039; =&gt; &#039;Oe&#039;,
&#039;/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/&#039; =&gt; &#039;A&#039;,
&#039;/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/&#039; =&gt; &#039;a&#039;,
&#039;/Ç|Ć|Ĉ|Ċ|Č/&#039; =&gt; &#039;C&#039;,
&#039;/ç|ć|ĉ|ċ|č/&#039; =&gt; &#039;c&#039;,
&#039;/Ð|Ď|Đ/&#039; =&gt; &#039;D&#039;,
&#039;/ð|ď|đ/&#039; =&gt; &#039;d&#039;,
&#039;/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/&#039; =&gt; &#039;E&#039;,
&#039;/è|é|ê|ë|ē|ĕ|ė|ę|ě/&#039; =&gt; &#039;e&#039;,
&#039;/Ĝ|Ğ|Ġ|Ģ/&#039; =&gt; &#039;G&#039;,
&#039;/ĝ|ğ|ġ|ģ/&#039; =&gt; &#039;g&#039;,
&#039;/Ĥ|Ħ/&#039; =&gt; &#039;H&#039;,
&#039;/ĥ|ħ/&#039; =&gt; &#039;h&#039;,
&#039;/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/&#039; =&gt; &#039;I&#039;,
&#039;/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/&#039; =&gt; &#039;i&#039;,
&#039;/Ĵ/&#039; =&gt; &#039;J&#039;,
&#039;/ĵ/&#039; =&gt; &#039;j&#039;,
&#039;/Ķ/&#039; =&gt; &#039;K&#039;,
&#039;/ķ/&#039; =&gt; &#039;k&#039;,
&#039;/Ĺ|Ļ|Ľ|Ŀ|Ł/&#039; =&gt; &#039;L&#039;,
&#039;/ĺ|ļ|ľ|ŀ|ł/&#039; =&gt; &#039;l&#039;,
&#039;/Ñ|Ń|Ņ|Ň/&#039; =&gt; &#039;N&#039;,
&#039;/ñ|ń|ņ|ň|ŉ/&#039; =&gt; &#039;n&#039;,
&#039;/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/&#039; =&gt; &#039;O&#039;,
&#039;/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/&#039; =&gt; &#039;o&#039;,
&#039;/Ŕ|Ŗ|Ř/&#039; =&gt; &#039;R&#039;,
&#039;/ŕ|ŗ|ř/&#039; =&gt; &#039;r&#039;,
&#039;/Ś|Ŝ|Ş|Ș|Š/&#039; =&gt; &#039;S&#039;,
&#039;/ś|ŝ|ş|ș|š|ſ/&#039; =&gt; &#039;s&#039;,
&#039;/Ţ|Ț|Ť|Ŧ/&#039; =&gt; &#039;T&#039;,
&#039;/ţ|ț|ť|ŧ/&#039; =&gt; &#039;t&#039;,
&#039;/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/&#039; =&gt; &#039;U&#039;,
&#039;/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/&#039; =&gt; &#039;u&#039;,
&#039;/Ý|Ÿ|Ŷ/&#039; =&gt; &#039;Y&#039;,
&#039;/ý|ÿ|ŷ/&#039; =&gt; &#039;y&#039;,
&#039;/Ŵ/&#039; =&gt; &#039;W&#039;,
&#039;/ŵ/&#039; =&gt; &#039;w&#039;,
&#039;/Ź|Ż|Ž/&#039; =&gt; &#039;Z&#039;,
&#039;/ź|ż|ž/&#039; =&gt; &#039;z&#039;,
&#039;/Æ|Ǽ/&#039; =&gt; &#039;AE&#039;,
&#039;/ß/&#039; =&gt; &#039;ss&#039;,
&#039;/Ĳ/&#039; =&gt; &#039;IJ&#039;,
&#039;/ĳ/&#039; =&gt; &#039;ij&#039;,
&#039;/Œ/&#039; =&gt; &#039;OE&#039;,
&#039;/ƒ/&#039; =&gt; &#039;f&#039;
);
         $quotedReplacement = preg_quote($separator, &#039;/&#039;);
         $merge = array(
                  &#039;/[^\s\p{Zs}\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu&#039; =&gt; &#039; &#039;,
                  &#039;/[\s\p{Zs}]+/mu&#039; =&gt; $separator,
 sprintf(&#039;/^[%s]+|[%s]+$/&#039;, $quotedReplacement, $quotedReplacement) =&gt; &#039;&#039;,
  );
        $map = $_transliteration + $merge;
        unset($_transliteration);
        return preg_replace(array_keys($map), array_values($map), $string);
},قدم پنجم: این کد هم برای کنترلر هستش که میتونید دیتارو اضافه کنید.Post::create([ 
&#039;user_id&#039; =&gt; auth::user()-&gt;id,
&#039;name&#039; =&gt; $request-&gt;name,
&#039;description&#039; =&gt; $request-&gt;description,
 ]); نکته ی مهم: حالا شاید براتون سوال باشه که چرا توی قدم پنج slug نیستش یعنی آدرس از اینجا ذخیره نمیشه! خوب باید در جواب این سوال بهتون بگم که توی قدم سوم ما کد زیر داریم که توی مدل هستش.public function sluggable(): array  {
      return [ &#039;slug&#039; =&gt; [ &#039;source&#039; =&gt; &#039;name&#039; ] ];
 }که گقتیم name هرچی باشه slug هم از اون باید استفاده کنه . این name هم همون دیتایی هستش که شما میخواید آدرس صفحه براساس اون ساخته بشه.خوب کارامون تموم شد و شما میتونید آدرس فارسی ذخیره کنید. امیدوارم که این مطلب براتون مفید واقع بشه. اگه سوالی داشتید و یا محتوای این پست اشکال داشت خوشحال میشم توی نظرات مطرح کنید.ممنون بابت وقتی گذاشتید :)</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>محمد جوان صفاری</author>
                <pubDate>Wed, 07 Sep 2022 13:13:15 +0430</pubDate>
            </item>
                    <item>
                <title>لاگین با گوگل در لاراول</title>
                <link>https://virgool.io/laravel-community/%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%D8%A8%D8%A7-%DA%AF%D9%88%DA%AF%D9%84-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-gizrm55hjjnl</link>
                <description>ساخت لاگین با گوگل توی لاراول ساده تر از اونیه که فکرشو بکنید فقط یکم باید دقت کنیدکار با نصب laravel/socialite شروع میشه با این پکیج میتونید با linkedin, google, github, gitlab لاگین بسازیدنصبش با کامپوزره :composer require laravel/socialiteمشاهده آموزش کامل توی یوتوب (۲۱ دقیقه) : https://www.youtube.com/watch?v=05mL6f4xCAAسورس نمونه توی گیتهاب :‌ https://github.com/shopid-dev/laravel-socialiteبعدش باید توی config/services.phpاینو اد کنید :&#039;github&#039; =&gt; [
&#039;client_id&#039; =&gt; env(&#039;GITHUB_CLIENT_ID&#039;),
&#039;client_secret&#039; =&gt; env(&#039;GITHUB_CLIENT_SECRET&#039;),
&#039;redirect&#039; =&gt; &#039;http://example.com/callback-url&#039;,
],مقادیر client_id و client_secret باید از گوگل بگیریدredirect هم آدرس سایت و مسیریه که وقتی از گوگل برمیگردید باید ست کنیدگرفتن client_id و client_secret از گوگلمشاهده فیلم این قسمت توی یوتوب این قسمتش تقریبا سخت ترین قسمتش شاید باشه چون اینجا یکم تحریمه ولی مشکلی بابت لاگین کردن نداره فقط گرفتنش یکم سختهفقط توی گوگل بزنید google developer console و وارد سایتش بشیداگه پروژه ای نداشته باشید باید یدونه بسازید اکه قبلا consent screen کانفیگ نکرده باشید اینجا میگه برید کانفیگ کنیداینجا External بزنید و Create بزنیداینجا همه چیزایی که میخواد وارد کنید البته خیلیش آپشنال هستآخرشم SAVE AND CONTINUE بزنید و برید توی قسمت Credentialsبعدش از اون منوی بالا روی CREATE CREDENTIALS + کلیک کنیدو بزنید روی OAuth client IDبعدش Web application انتخاب کنیداینجا هم موارد خواسته شده پر کنیدبعدش میریم توی سورسمون و اون redirect میاریممیزنیم توی Authorized redirect URIs و Create میزنیمو در آخر  client_id و client_secret میاد !و میریم ثبتش میکنیممشاهده این قسمتش توی یوتوبحالا یه روت میسازیم که وقتی میریم توش بره تو گوگل به همین سادگی !use Laravel\Socialite\Facades\Socialite;
//.
//.
Route::get(&amp;quot/login&amp;quot, function () {  
return Socialite::driver(&#039;google&#039;)-&gt;redirect();
});و روت بازگشتمون هم میسازیم :به این صورت که با firstOrCreate روی مدل User اگه کاربر قبلا ثبت نام نبود رجیسترش میکنیم با یه پسورد رندم ولی اگه بود انتخابش میکنیم و در آخر میدیمش به Auth::login و احراز هویت تکمیل میشه !Route::get(&amp;quot/google-login&amp;quot, function () {
    $s_user = Socialite::driver(&#039;google&#039;)-&gt;user();
    $user = User::firstOrCreate(
        [&#039;email&#039; =&gt; $s_user-&gt;email],
        [
            &#039;name&#039; =&gt; $s_user-&gt;name,
            &#039;password&#039; =&gt; Hash::make(Str::random(8))
        ]
    );
    Auth::login($user, true);
         echo &amp;quothello &amp;quot.Auth::user()-&gt;name;
});مشاهده فیلم نتیجه ی نهایی :https://www.youtube.com/watch?v=05mL6f4xCAA&amp;amp;t=1171s </description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>shopid</author>
                <pubDate>Wed, 07 Sep 2022 12:29:40 +0430</pubDate>
            </item>
                    <item>
                <title>لاراول دیباگبار چیست؟ (به همراه آموزش ویدیویی?) (Laravel debugbar)</title>
                <link>https://virgool.io/laravel-community/laravel-debugbar-di06mknk7ysh</link>
                <description>سلام امیدوارم حالتون خوب باشه، میتونید محتوایی که داخل این مقاله وجود داره رو به صورت ویدیویی هم ببینید، فقط کافیه روی این لینک کیلیک کنید.??پکیج Laravel debugbar ابزاری هست که از پکیج PHP debugbar استفاده کرده برای محیط Laravel، شما با استفاده از این پکیج میتونید راحت تر نرم افزارتون رو آنالیز کنید و متوجه باگ های نرم افزارتون بشید.روش نصب پکیج Laravel debugbarشما میتونید با استفاده از کامپوزر خیلی راحت این پکیج رو نصب کنید، با استفاده از دستور زیر: (راستی من یه مقاله راجب کامپوزر هم نوشتم که به صورت کامل همه چیز رو باهم برسی کردیم، حتما اون رو هم بخون?)composer require barryvdh/laravel-debugbar --devدستور --dev که گذاشتیم برای اینه که به کامپوزر بگیم این پکیج رو فقط برای محیط development برای ما نصب کن، چون میاد یکسری اطلاعات از نرم افزار ما جمع آوری میکنه، ممکنه توی محیط Production نرم افزار رو کند کنه و توصیه نمیشه تو محیط Production ازش استفاده بشه.اگر از auto-discovery که به صورت پیشفرض روی لاراول وجود داره استفاده میکنید فقط کافیه که وارد config\app.php بشید و مقدار APP_DEBUG رو برابر true قرار بدید.اگر هم از auto-discovery استفاده نمیکنید که باید کد زیر را: Barryvdh\Debugbar\ServiceProvider::class,در بخش ServiceProvider توی آرایه Provider در فایل config/app.php قرار بدید و اگر هم میخواید از facade برای log گرفتن مسیج ها استفاده کنید، کد زیر رو &#039;Debugbar&#039; =&gt; Barryvdh\Debugbar\Facades\Debugbar::class,به بخش facades در app.php اضافه کنید.اگر مراحل بالارو بدون هیچ مشکلی انجام داده باشید، الان پکیج روی پروژتون نصب شده و میتونید ازش استفاده کنید.Messages tabبه تصویر بالا توجه کنید، وقتی پکیج روی پروژتون نصب باشه یک آیکون لاراول پایین سمت چپ مرورگرتون پدیدار میشه، که اگر روش کلیک کنید یک پنجره مثل عکس باز میشه که شامل تعدادی Tab هست که تب اول تب Messages یا همون پیام ها هستش، توی این تب شما میتونید از اطلاعاتتون با یک استایل مشخص Dump بگیرید یه چیزی مثل Console مرورگر هست با یکسری استایل.با استفاده از متد های زیر شما میتونید اطلاعاتتون رو توی این تب نمایش بدید: Debugbar::info($object);Debugbar::error(&#039;Error!&#039;);Debugbar::warning(&#039;Watch out…&#039;);Debugbar::addMessage(&#039;Another message&#039;, &#039;mylabel&#039;);Timeline tabشما با استفاده از این تب میتونید ببینید که هر درخواست چقدر طول کشیده تا انجام بشه، همچنین میتونید متوجه بشید کل نرم افزارتون چقدر زمان برده تا اجرا بشه در حقیقت Boot بشه.متد های زیر برای این تب تعریف شده اند: Debugbar::startMeasure(&#039;render&#039;,&#039;Time for rendering&#039;);Debugbar::stopMeasure(&#039;render&#039;);Debugbar::addMeasure(&#039;now&#039;, LARAVEL_START, microtime(true));Debugbar::measure(&#039;My long operation&#039;, function() {    // Do something…});Exceptions tabتوی این تب، Exception های نرم افزارتون رو نمایش میده، به شکل زیر توجه کنید: متد Exception این که کجا Throw شده تکه کدی که Exception داشته و یک آرایه از اطلاعاتش رو براتون نمایش میده، که شما با تکه کد زیر میتونید Exception هاتون رو به این صورت داشته باشید، البته که اگر از کد زیر هم استفاده نکنید باز هم این اطلاعات رو میده، ولی نرم افزارتون رو متوقف میکنه.try {               throw new \Exception(&amp;quotاین متد Exception است.&amp;quot);} catch (\Exception $e) {                Debugbar::addException($e);}Views tabتوی این تب تمام View ها یا تمپلیت (Template) هایی که به واسطه Route کنونی لود شده رو نمایش میده و اگر روی هر کدوم کلیک کنید، پارامتر هایی که این ویو دریافت کرده رو هم بهتون میگه، به تصویر زیر توجه کنید:پارامتر این ویو orders هست که اگر تصویر زیر رو ببینید متوجه خواهید شد:Route tabاین تب تمام اطلاعات مربوط به Current Route یا روت کنونی رو براتون نمایش میده به تصویر زیر توجه کنید:Queries tabاین تب تمام کوئری هایی که به واسطه روت کنونی زده شده رو براتون نمایش میده به صورت SQL و حتی زمان اجرا و فایلی که اجرا شده رو هم بهتون میگه، به تصویر زیر توجه کنید:Models tabتمام مدل هایی که توی کنترلر مربوط به این Route ازشون استفاده شده رو نمایش میده.Sessions tabهمونطور که از اسمش مشخصه تمام سشن های که ست شده رو نمایش میده.Request tabتمام اطلاعات مربوط به ریکوئست کنونی رو نمایش میده:سمت راست پنجره رو اگر نگاه کنید یک سری اطلاعات میبینید:ریکوئست متد و روتی که بهش ریکوئست زده شده، میزان فضایی که از مموری اشغال شده، میزان زمانی که طول کشیده تا اجرا بشه و نسخه PHP و آیکون فولدر هم مربوط به previous endpoint request یا همون روت هایی که قبلا بهش ریکوئست زده شده که میتونید مرتبشون هم بکنید، یا کلا همشون رو پاک کنید. https://www.aparat.com/v/9lrwx خیلی ممنونم ازتون که وقت گذاشتید و تا اینجا مطالعه کردیدید??ممنون میشم نظرتون رو توی بخش کامنت ها بنویسید و این مقاله رو لایک کنید، لایک کردن شما باعث بیشتر دیده شدن این مقاله میشه و به من انگیزه میده، اگر دوست داشتید باهم گپ بزنیم میتونید از راه های ارتباطی زیر با من در ارتباط باشید:ایمیل | لینکدین</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>مسعود هارونی</author>
                <pubDate>Sun, 04 Sep 2022 20:51:35 +0430</pubDate>
            </item>
                    <item>
                <title>تینکر در لاراول چیست؟! یک پکیج فوق العاده برای کار با تینکر?</title>
                <link>https://virgool.io/laravel-community/what-is-tinker-sbwvwnbvrvwz</link>
                <description>تصور کنید قراره مقدار بازگشتی مدل Article رو به صورت دستی تست کنید و از صحت و درستی اطلاعات به صورت عینی اطمینان حاصل کنید و پروژه روی Production mood هست، چه میکنید؟!اگر طریقه‎ی استفاده از Tinker را بلد نباشید یک Route موقت میسازید و یک callable funciton به بخش action آن پاس میدهید و خروجی که میخواهید ببینید را چاپ میکنید، باید تغیرات را commit کنید و پوش کنید روی Github یا هر سرویس دیگه ای که استفاده میکنید، فقط و فقط برای تست یک مقدار از یک متد.احتمال این هم وجود دارد که بعد از اینکه تست مورد نظرتون رو انجام دادید Routeی که مشخص کرده بودید رو پاک نکنید و این Route یک روت پابلیک است که هیچ permissionی و یا middlewareی روش ست نشده و خب ممکنه که امنیت وبسایت شمارو تحت شعاع قرار بده.اینجاست که تینکر به دادمون میرسه.?تینکر یک ابزاره برای لاراول که شما با استفاده ازش میتونید با کل اپلیکیشن لاراولیتون Intraction داشته باشید در حقیقت بتونید با کل اپلیکیشنتون ارتباط برقرار کنید فقط و فقط از طریق Command line.شما با استفاده از دستور زیر میتونید از تینکر استفاده کنید.php artisan tinkerبعد از این دستور هر کد PHPای که بخواید میتونید بزنید و با Enter خروجی رو بهتون نشون میده.تینکر به صورت پیشفرض روی تمام اپلیکیشن های لاراولی موجود است، ولی اگر به هر دلیلی روی اپلیکیشنتون وجود نداشت میتونید از روش زیر نصبش کنید: composer require laravel/tinkerمحدودیت تینکرزمانی که شما از تینکر استفاده میکنید با یک محدودیت روبه رو میشید، اون هم اینه که دستوراتی که مینویسید فقط باید در یک خط باشن.اصلا نگران نباشید، الان دوتا راه حل میدم بهتون که راحت بتونید این محدودیت رو دور بزنید.?✔راه حل اولمتونید از Editor خوده Tinker استفاده کنید، که یک فضایی رو در اختیارتون قرار میده برای نوشتن دستوراتتون، برای استفاده از این ادیتور شما باید اول خوده تینکر رو با دستوی که قبلا برسی کردیم ران کنید و دستور edit را بزنید.php artisan tinkereditراه حل دومکار کردن با استفاده از این روش خیلی راه تر از روش قبل هست، چون میخوایم از یک پکیج استفاده کنیم که کاملا رایگانه و یک محیط گرافیکی توی مرورگر برای استفاده از تینکر در اختیارمون قرار میده.نصب و استفاده از این پکیج خیلی راحته، که در ادامه برسیش میکنیم.این پکیج رو با استفاده از کامپوزر نصب میکنیم، اگر نمیدونی کامپوزر چیه، حتما این مقاله رو بخون.composer require spatie/laravel-web-tinker --devبعد از نصب باید assetهای مربوط به این پکیج رو توی حالت publish قرار بدیم، که با استفاده از دستور زیر این کارو انجام میدیم: php artisan web-tinker:installپکیج ما الان آمادست که ازش استفاده کنیم، فقط کافیه روت tinker را در مرورگر باز کنیم، چنین محیطی را در اختیارمون قرار میده که سمت چپ کدهای مدنظرمون رو مینویسیم، و سمت راست با زدن ctrl+enter میتوانید خروجی را ببینید.ما میتوانستیم از tinkerwell هم استفاده کنیم، ولی هدف از این مقاله این بود که با استفاده از یک پکیج رایگان این کار را انجام دهیم.⭐ امیدوارم از این مقاله لذت برده باشید، لطفا مقاله رو لایک کنید و نظرتون رو حتما برام بنویسید، من رو هم  در اینستاگرام دنبال کنید، تا بیشتر بتونیم باهم ارتباط برقرار کنیم.- راه های ارتباطی با من : اینستاگرام - ایمیلارادتمند شما مسعود هارونی</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>مسعود هارونی</author>
                <pubDate>Wed, 24 Aug 2022 01:45:52 +0430</pubDate>
            </item>
                    <item>
                <title>ثبت نام کارگاه کدنویسی تمیز در لاراول شروع شد ...</title>
                <link>https://virgool.io/laravel-community/%D8%AB%D8%A8%D8%AA-%D9%86%D8%A7%D9%85-%DA%A9%D8%A7%D8%B1%DA%AF%D8%A7%D9%87-%DA%A9%D8%AF%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AA%D9%85%DB%8C%D8%B2-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%B4%D8%B1%D9%88%D8%B9-%D8%B4%D8%AF-ockt0jo9tz4b</link>
                <description>آیا می دونستی برای کدنویسی تمیز در لاراول دیگه نیازی به وایتکس نداری ؟ما یک کارگاه رو خواهیم داشت که در اون قصد داریم به شما کدنویسی تمیز در لاراول رو آموزش دهیم / این رویداد از این جا شروع شد که من سال ها پیش وقتی یکی از اعضای تیم کدکثیفی رو می نوشت می گفتم که دیگه برای این کد هیچ کاری نمیشه کرد مگر این که بری روش وایتکس بریزی که تمیز بشه کدنویسی تمیز در لاراولو همین هم شد که تصمیم گرفتیم که این رویداد رو برگذار کنیم و همان طور که به هم تیمی هام کمک میکردم کدتمیز تری رو بنویسند به سایر دوستان هم کمک کنم / کد تمیز تری رو بنویسند . هزینه شرکت در این رویداد :قیمتش رو قرار بود بزاریم ۴۰۰.۰۰۰ تومان ولی خدایش دلمون نمیاد فقط برای این که هزینه های برگزاریش در بیاد هزینه اش رو گذاشتیم ۱۵۰.۰۰۰ تومانتازه اگر حاظر باشی توی تبلیغات حامی ما باشی و توی شبکه های اجتماعی که داری ما رو به دوستات معرفی کنی بهت ۵۰ درصد تخفیف میدهیمدیگه چی میخواهید ؟زمان برگذاریش هم ۱۰ شهریور ۱۴۰۱ هستتوضیحات بیشتر رو میتونی از (کارگاه کد تمیز در برنامه نویسی لارول) مشاهده کنی و اگر هم مایل بودی ثبت نام کنیبرای پیش ثبت نام میتونی فرم زیر رو تکمیل کنی :‌https://alirezap30web.ir/php-clean-code/نکته مهم :‌باتوجه به این که ظرفیت محدود هست پیشنهاد میکنم هرچه سریع تر پیش ثبت نام تون رو انجام دهید / پیش ثبت نام بدون پرداخت هزینه می باشد .</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Mon, 22 Aug 2022 19:26:44 +0430</pubDate>
            </item>
                    <item>
                <title>یادگیری مقدماتی لاراول - پارت دوازدهم</title>
                <link>https://virgool.io/laravel-community/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D9%BE%D8%A7%D8%B1%D8%AA-%D8%AF%D9%88%D8%A7%D8%B2%D8%AF%D9%87%D9%85-hm9bzwhdu3zm</link>
                <description>تذکر: این یک پست آموزشی برای عموم نیست! بلکه تنها جایی برای یادداشت‌های من حین یادگیریه تا بهتر به خاطر بسپارم و در صورت لزوم به اون‌ها مراجعه کنم.قسمت ۱۴۴ تا ۱۵۷آشنایی با ویژگی‌های جدید لاراول ۸:لاراول هر ۶ ماه یک ورژن جدید میده، نسخه‌های LTS پشتیبانی ۲ ساله برای رفع باگ و ۳ ساله برای باگ های امنیتی داره، اما نسخه‌های غیر LTS پشتیبانی ۷ ماهه رفع باگ و ۱ ساله امنیتی دارن.توی لاراول ورژن ۸، ورژن php حتما باید برابر یا بزرگتر از ۷.۳ باشه، برای آپدیت می‌تونیم XAMPP رو آپدیت کنیم و حتما قبلش باید از دیتابیس‌های خودمون بک‌آپ بگیریم.وقتی composer نصب میشه، متغیرهای محیطی رو ست می‌کنه و به راحتی به php و... داخل CLI دسترسی داریم. پس می‌تونیم به جای پاک کردن XAMPP نسخه جدید php رو نصب کنیم و env جدید رو ست کنیم.مبحث Model Directory:توی نسخه‌های قبلی وقتی یک Model ایجاد می‌کردیم؛ می‌رفت و به صورت Name.php داخل پوشهٔ app قرار می‌گرفت؛ اما توی نسخهٔ جدید داخل app/Models قرار می‌گیرن و namespace ما میشه App/Models.بهبود artisan serve:قبلا اگر فایل .env رو تغییر می‌دادیم و server ما ران شده بود؛ حتما باید اون رو می‌بستیم و دوباره اجرا کنیم؛ اما توی نسخهٔ جدید به محض تغییر در فایل env، خود سرور restart میشه.مبحث Routing namespace:قبلا برای دسترسی به متد یک کنترلر می‌زدیم:Route::get(&#039;/home&#039;, &#039;HomeController@index&#039;);اما حالا باید اینطوری عمل کنیم:Route::get(&#039;/home&#039;, [HomeController::class, &#039;index&#039;]);که فضای نام HomeController رو باید use کنیم:use App\Http\Controllers\HomeControllerاز اونجایی که ::class برای ما string اون فضای نام رو برمی‌گردونه، پس می‌تونیم بنویسیم:Route::get(&#039;/home&#039;, [&#039;App\Http\Controllers\HomeController&#039;, &#039;index&#039;]);برای resource هم به شکل زیر عمل میشه:Route::resource(&#039;posts&#039;, PostController::class);توی ورژن‌های قبلی لاراول namespace ما use می‌شد؛ اما توی ورژن ۸ این اتفاق نمی‌افته، اما می‌تونیم لاراول رو طوری تنظیم کنیم که این اتفاق بیفته، برای این کار باید مقدار زیر رو در RouteServiceProvider.php از کامنت در بیاریم:protected $namespace = &#039;App\\Http\\Controllers&#039;;با این کار به راحتی می‌تونیم به همون روش قدیمی و فرمول زیر به متدهای کنترلر خودمون دسترسی داشته باشیم:Route::get(&#039;/routename&#039;, &#039;NameController@method&#039;);اما بهتره که namespace رو خودمون دستی صدا بزنیم و از اصول لاراول پیروی کنیم.مبحث Model Factory Class:همون‌طور که از قبل می‌دونیم؛ factory یک ویژگی‌ هست که کار با seeders رو برای ما راحت‌تر می‌کنه؛ Factoryهای ما توی پوشهٔ database/factories قرار دارن و به فرم زیر هستن:توی کد بالا، یک متغیر از نوع protected به اسم model داریم که مقدار User::class داره، به همین خاطر به Factory می‌گیم Model Factory.کلاس فکتوری یک متد داره به اسم definition که توش فیلدهای جدولی که قراره پر بشه رو میاریم و به کمک کتابخونهٔ faker پرش می‌کنیم.بریم برای ساخت یک Factory واقعی توی لاراول ۸:php artisan make:factory PostFactory --model=Postحالا از قبل باید Migration و Model رو داشته باشیم و ستون مد نظر رو توی Migration ایجاد کنیم و migrate بزنیم تا توی دیتابیس اعمال بشه، حالا برای پر کردن ستون می‌تونیم به روش زیر عمل کنیم:حالا برای صدا زدن Faker می‌تونیم به روش زیر عمل کنیم:PostFactory::new()-&gt;create();روش دیگه استفاده از مدل Post هست:Post::factory()-&gt;create();یک متدی داریم به اسم make و تفاوتش با create اینه که دادهٔ فیک ایجاد می‌کنه، اما توی دیتابیس و جدول ذخیره نمی کنه:Post::factory()-&gt;make();با متد count هم به راحتی می‌تونیم تعداد دیتای فیکی که قراره ایجاد بشه رو مشخص کنیم:Post:;factory()-&gt;count(5)-&gt;create();نمایی از جدول posts:تغییر بزرگ لاراول Jeststream:جت استریم در واقع میاد و یک scaffolding سمت فرانت برای ما ایجاد می‌کنه که کلی قابلیت داره، مثل:۱- لاگین۲- رجیستر کردن۳- تایید ایمیل۴- تایید هویت دو مرحله‌ای۵- مدیریت سشن‌ها۶- ساپورت از Laravel Santcum APIو...جت استریم به صورت دیفالت از فریمورک Tailwind CSS استفاده می‌کنه، اما میشه به جای اون از Livewire و یا Inertia هم استفاده کرد.در واقع Jetstream که به وسیله Taylor Otwell نوشته شده، کمک می‌کنه که بخش‌های مختلف فرانت پروژه رو خیلی سریع با کمک Tailwind CSS و Livewire و Inertia توسعه بدیم. اما طبیعتا اجباری در استفاده از اون نیست و ما همچنان می‌تونیم از بسته Laravel/ui برای توسعه فرانت کمک بگیریم.این بسته در بک‌اند از پکیج Fortify برای پیاده‌سازی auth و... کمک می‌گیره که این خیلی مهمه و ما می‌تونیم از این بسته با فرانت دلخهواه خودمون مثل ‌Bootstrap استفاده کنیم.آشنایی مقدماتی با فریمورک Tailwind:یک فریمورک برای CSS (مثل bootstarp و materialize) که به راحتی قابل کاستوم کردنه، علت اینکه خیلی راحت میشه یک طرح کاستوم باهاش زد، اینه که این یک فریمورک سطح پایین هست و چیزهایی مثل کامپوننت‌های آمادهٔ بوت استرپ رو اینجا نمی‌بینیم؛ مثلا دیگه کلاسی برای ایجاد card وجود نداره و این برنامه نویس هست که باید با کنار هم قرار دادن کلاس‌های مختلف (به صورت ماژولار)، اون چیزی که دنبالش هست رو ایجاد کنه.آشنایی مقدماتی با Livewire:خب livewire یک فریمورک فول استک برای لاراوله، این فریمورک فقط و فقط روی لاراول کار می‌کنه و هدفش ایجاد یک اینترفیس داینامیک برای ما هست تا بدون refresh شدن صفحه، اکشن‌های خاصی رو انجام بده (ارتباط با سرور بدون نیاز به رفرش کردن صفحه).در واقع این فریمورک بین فرانت و بک پروژهٔ لاراولی سیم‌کشی می‌کنه و بینشون ارتباط برقرار می‌کنه، بدون نیاز به ریلود یا رفرش کردن صفحه.آیا با اومدن چیزی مثل Livewire باید فریمورک‌های فرانت مثل Vue و React رو بذاریم کنار؟خیر، چرا که با توجه به هدف پروژه ما میاییم و ابزار رو انتخاب می‌کنیم؛ مثلا اگر قرار باشه فرانت پروژه کاملا از بک پروژه جدا باشه، بک پروژه ممکنه روی یک سرور باشه و فرانت روی یک سرور دیگه و... پس مجبوریم از فریمورک‌های فرانتی استفاده کنیم.اما livewire توی پروژه‌های کوچکتر کاربرد داره و Front و Back هر دو لاراولی هستن، اما این مزیت بزرگ رو ایجاد می‌کنه که بدون نیاز به دانش عمیق فرانت، اپلیکیشن‌های خوبی رو پیاده‌سازی کرد.آشنایی مقدماتی با Inertia:با استفاده از Inertiajs میشه یک single page application ایجاد کرد؛ در واقع این Inertia به ما کمک می‌کنه که Dynamic Interface ایجاد کنیم؛ بدون اینکه نیازی به API داشته باشیم. Inertia برخلاف Livewire که اصلا از فریمورک‌های فرانتی استفاده نمی‌کنه، از فریمورک‌های فرانتی استفاده می‌کنه، با این تفاوت که API دیگه وجود نداره.آشنایی با بستهٔ Fortify:بستهٔ Fortify لاراول یک Back-end برای سیستم Authentication هست که مستقل از frontend عمل می‌کنه. قبلا برای سیستم auth از laravel/ui استفاده میشد که مشکل اصلی اون این بود که فقط از bootstrap، React و Vue پشتیبانی می‌کرد و برای سایر فریمورک‌های باید یه سری customization انجام می‌دادیم؛ اما توی Fortify دیگه وابسته به فرانت نیستیم و این سیستم مستقل از فرانت در بک پیاده‌سازی میشه.توی Fortify کافیه که input های خودمون رو به روت‌های Fortify ارسال کنیم تا خودش باقی کارها رو انجام بده. ما یه سری داده رو ارسال می‌کنیم به روتی که نیاز داریم و بقیه کارها در سمت بک به وسیله این بسته هندل میشه.برای نصب این بسته:composer require laravel/fortifyبعد هم باید منابع Fortify رو publish کنیم:php artisan vendor:publish --provider=&amp;quotLaravel\Fortify\FortifyServiceProvider&amp;quotبا دستور بالا، Service Provider این بسته رو از vendor به پوشهٔ Providers پابلیش کردیم. و در نهایت باید یک بار migrate بزنیم تا ستون‌های مورد نیاز Fortify در جدول users اضافه بشه.php artisan migrateیکی از این ستون‌ها، two-factor_secret هست و دیگری two_factor_recovery_codes.نکته بعدی اینکه حتما باید FortifyServiceProvider رو به فایل app.php در config اضافه کنیم:&#039;providers&#039; =&gt; [ App\Providers\FortifyServiceProvider::class, ...];با نصب Fortify و اضافه کردن Service Provider اون به پروژه و عملیات migrate و تنظیم app.php حالا باید بریم ببینیم که چه بلایی بر سر پروژه اومده و چه چیزهایی اضافه شده:توی پوشهٔ app یک پوشه به اسم Actions به وجود اومده که داخل اون یک پوشه به اسم Fortify هست که یک سری از کلاس‌های این بسته درش قرار دارن:فایل FortifyServiceProvider.php هم که دو تا متد boot و register داره:توی همین متد boot می‌تونیم view لاگین، رجیستر و... رو تعیین کنیم.فایل مهم بعدی مربوط به کانفیگ‌های Fortify میشه که توی پوشهٔ config با نام fortify.php قرار گرفته. این کانفیگ شامل مواردی مثل لاگین با username یا email، تغییر فیلد email، فعال و غیرفعال‌سازی featureها و... میشه.خب، حالا بریم سراغ اینکه view مربوط به صفحهٔ لاگین رو تعریف کنیم و توی متد boot مربوط به FortifyServiceProvider اون view رو فراخوانی کنیم:خب یه فایل login.blade.php هم باید توی resources ایجاد کنیم و یه المنت فرضی توش بذاریم. نکتهٔ مهم بعدی هم اینه که برخلاف laravel/ui در fortify نیازی به پیاده‌سازی route برای صفحهٔ authentication نداریم. حالا با رفتن به localhost:8000/login وارد صفحهٔ لاگین می‌شیم.برای رجیستر هم می‌تونیم همین کار رو بکنیم:توی laravel/ui بسته‌های مورد نیاز به package.json اضافه میشدن و به راحتی می‌تونستیم نصبشون کنیم؛ اما توی بحث fortify باید این کار رو (یعنی نصب بوت استرپ) رو دستی انجام بدیم:نکته: اون خط‌های قرمز که نشون دهندهٔ خطا هست؛ مشکلی نداره و توی فیلم آموزشی بعد از اینکه vscode رو ری استارت کرد؛ حل شد، ظاهرا توی شناختن namespace مربوط به fortify مشکل داشت که حل شد.برقراری ارتباط بین فرانت و Fortify:برای استفاده از Bootstrap داخل پروژهٔ لاراولی خودمون چندین راه داریم:۱- نصب از طریق npm۲- استفاده از CDN۳- دانلود فایل‌ها و استفاده از اون داخل public (دسترسی با asset helper function)در واقع قبلا که با laravel/ui کار می‌کردیم؛ این بسته می‌اومد و با npm که یک پکیج منجر هست سه تا کتابخونهٔ Vue.js یا react و یا bootstrap رو برای ما نصب می‌کرد؛ در واقع بسته‌های مورد نیاز به package.json اضافه میشد؛ بعد ما نصبش می‌کردیم و با laravel mix ازش خروجی می‌گرفتیم.روش حرفه ای تر نسبت به CDN و استفاده از فایل‌های دانلودی در public، استفاده از package manager هست. یعنی با npm هر چیزی رو که نیاز داریم نصب کنیم و با laravel mix در نهایت compile کنیم و بزنیم تنگ پروژه. برای این کار یک پوشه به اسم css و js در public می‌سازیم و با mix خروجی نهایی رو اونجا قرار می‌دیم.برای نصب بوت استرپ و ملزوماتش با npm اول از همه یک npm install می‌زنیم تا بسته‌های زیر نصب بشه:بعدش نیازمندی‌های بوت استرپ رو نصب می‌کنیم:npm install bootstrap popper.js sass jquery sass-loaderبسته sass-loader برای webpack هست که میاد و sass رو برای ما compile می‌کنه. تمامی این بسته‌ها توی پوشهٔ node_modules توی root پروژه نصب میشن.خب حالا باید با laravel mix بیاییم و فایل‌های css و js رو کامپایل کنیم و توی js و css داخل public قرار بدیم؛ در واقع خود laravel mix میاد و از webpack برای این کار استفاده می‌کنه.توی تصویر بالا داریم فایل app.js رو داخل پوشهٔ resources/js می‌بینیم که اومده و فایل bootstrap رو require کرده اما باید توجه داشته باشیم که این بوت استرپ راه‌انداز ما هست و نه اون فریمورک css. اگر نگاهی به فایل bootstrap.js که در واقع راه‌انداز ما هست بندازیم می‌بینیم که میاد و یه سری ابزار و بسته رو require می‌کنه، در نهایت laravel mix با استفاده از webpack میاد و این بسته‌ها رو commpile و تبدیل به یک فایل واحد می‌کنه و داخل public/js قرار میده:برای اینکه بتونیم bootstrap و jquery و popper.js رو هم کامپایل کنیم؛ باید خطوط زیر رو به راه انداز اضافه کنیم:وقتی متغیر رو به صورت window.name تعریف می‌کنیم در واقع اون name به صورت global در دسترس هست.نکته: توی تصویر بالا که اومده مثلا popper.js یا jquery رو require کرده فقط و فقط اسم بسته رو آورده که منظورش اینه که از node_modules بخون، اما توی app.js که راه‌انداز رو require کرده دقیقا گفته که ./bootstrap یعنی توی پوشهٔ جاری فایل bootstrap که البته میشد ./bootstrap.js هم نوشت.برای کامپایل شدن فایل‌های sass مربوط به بوت استرپ هم باید داخل resources/sass فایل app.scss رو ایجاد کنیم و داخلش عبارت زیر رو قرار بدیم تا بیاد و فایل scss مربوط به بوت استرپ رو از node_modules لود کنه:حالا باید فایل‌های موجود در node_modules رو که توی resources فراخوانی شدن، با استفاده از لاراول میکس و webpack کامپایل کنیم تا به صورت یک فایل جاوااسکریپتی یا css یکتا در بیان و خیلی راحت وابستگی هاشون هندل بشه و توی پروژه لود بشن.در زیر تصویری از webpack.mix.js رو می‌بینیم که توش laravel-mix رو require کردیم؛ بعدش هم با استفاده از متدهای js و sass اومدیم و گفتیم که فایل‌های موجود در app.js و app.scss رو برای ما توی public کامپایل کنه:برای کامپایل کردن، میزنیم:npm run devبعد از کامپایل این رو می‌بینیم:حالا خیلی راحت توی فایل‌های blade اون‌ها رو صدا می‌زنیم:طراحی صفحات Login و Register و ایجاد ارتباط میان input‌ها با Fortify:برای هندل کردن لاگین با Fortify باید داخل FortifyServiceProvider با استفاده از متد loginView بیاییم و view مربوط به لاگین رو صدا بزنیم:برای رجیستر، reset password و ...:محتوای فایل‌های blade مربوط به سیستم fortify auth رو اینجا آپلود کردم که البته در دسترس عموم نیست! ولی با ثبت نام توی webprog می‌تونید دانلودش کنید.تغییر سیستم لاگین از email به username:برای این کار باید یک فیلد username به migration جدول users اضافه کنیم و اون رو از نوع unique ست کنیم:و باید:// drop all tables and then run migration
php artisan migrate:freshحالا باید یک input برای user به blade فایل اضافه کنیم؛ بنابراین توی register.blade.php باید این فیلد رو به شکل زیر اضافه کنیم:خب view ما به شکل زیر در میاد:حالا باید کدهای مربوط به validation و ثبت user رو به CreateNewUser توی app/Actions/Fortify اضافه کنیم. در زیر کدهای validation مربوط به username رو می‌بینیم که بهش گفتیم unique:users یعنی داخل جدول users یکتا و واحد باشه.ثبت شدن رو باید به متد create هم اضافه کنیم:و حتما باید username رو به متغیر fillable داخل مدل User هم اضافه کنیم:باید view مربوط به login.balde.php رو هم برای پذیرش username اوکی کنیم:و view زیر رو تحویل می‌گیریم:حالا باید به Fortify هم بگیم که به جای email با username لاگین کنه، پس باید config/fortify.php رو اینطوری تنظیم کنیم:ایمن‌سازی رمز عبور:باید وارد app/Actions/Fortify/PasswordValidationRules بشیم و اونجا ruleهای جدید رو وارد کنیم. ما با اضافه کردن قطعه کد زیر، به لاراول گفتیم که برای password حتما باید ترکیبی از رشته و اعداد باشه:(new Password)-&gt;requireNumeric()برای اینکه حروف بزرگ، کوچک و کاراکترهای خاص رو هم شامل بشه:</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>عارف</author>
                <pubDate>Mon, 22 Aug 2022 01:18:46 +0430</pubDate>
            </item>
                    <item>
                <title>کامپوزر چیست؟! چرا باید از کامپوزر استفاده کنیم؟</title>
                <link>https://virgool.io/laravel-community/why-composer-and-what-is-it-c4xucjvaxkfw</link>
                <description>سلام امیدوارم حالتون خوب باشه، و سرشار از انرژی مثبت باشید.* بحث مدیریت وابستگی پروژه به پکیج‎ها و کتابخانه ‎ها خیلی بحث حیاتی و مهمی هستش و اگر ما از یک Package manager استفاده نکنیم ممکنه به دردسر بیوفتیم.کامپوزر (Composer) چیست؟!در کوتاه ترین تعریف، کامپوزر یک ابزار برای مدیریت وابستگی ها در PHP هست.شما کتابخانه هایی که برای پروژتون نیاز دارید رو وارد میکنید کامپوزر با تمام وابستگی هایی که دارند براتون نصب و مدیریتشون میکنه. ( این مقاله هدفش بیشتر صبحت در رابطه با بخش های فنی Composer هست و راجب فرایند نصب کامپوزر روی سیستم کامپیوتریتون صحبت نخواهیم کرد.)Composer initشاید اولین دستوری باشد که در کامپوزر یاد میگیریم، این دستور کامپوزر را برای پروژه ما initialize میکنه، در حقیقت با این کامند شما کامپوزر رو برای پروژتون استارت میزنید.یک سری سوال ازتون میپرسه و طبق جواب هایی که بهش میدید براتون یک فایل کانفیگ میسازه به اسم composer.json که تمام کانفیگ نرم افزارتون داخلش قرار داره.یک سری از سوالات کامپوزر رو اینجا براتون نوشتم: Package name (&lt;vendor&gt;/&lt;name&gt;) [masoudharooni/first-package]:اسم پکیج یا پروژتون رو میپرسه که یک اسم هم بهتون پیشنهاد میده که اگر Enter بزنید همون اسم پیشنهادی رو قرار میده. که اینجا : masoudharooni/first-package هست. ** در تمام مراحل اگر Enter بزنید و چیزی وارد نکنید، یا مقداری که بهتون پیشنهاد داده رو قرار میده یا خالی قرار میده اون بخش رو **Description []: توضیحی راجب پروژه رو ازتون میخواد.Author [masoud harooni &lt;masoudharooni50@gmail.com&gt;, n to skip]: نویسنده پکیج رو ازتون میخواد، که میتوانید نام نویسندگان را با کاما ( , ) جدا کنید.Minimum Stability []: شما اینجا میتونید یک رفتار پیشفرض (default behavior) تعریف کنید برای فیلتر کردن پکیج ها بر اساس پایداریشون (Stability ) که به صورت پیشفرض  stable هست.Package Type (e.g. library, project, metapackage, composer-plugin) []: project License []: دیگه فکر نمیکنم نیازی به توضیح داشته باشه. این کانفیگی هست که باهم ست کردیم: composer.jsonبریم سراغ کامندهایی که کامپوزر در اختیارمون قرار میدهComposer installکامپوزر به دنبال فایل comopser.lock میگردد اگر آن را پیدا کند، دقیقا همان پکیج هایی را که مشخص شده با همان ورژن ها نصب میکند، در غیر این صورت فایل composer.json رو میخواند و پکیج هایی که داخل بخش require مشخص شده رو نصب میکنه، و ورژن پکیج های نصب شده را داخل فایل composer.lock قرار میده.Composer updateبا استفاده از این کامند کامپوزر فایل کانفیگ  (composer.json) رو میخونه، اگر پکیجی در بخش require وجود داشته باشه که نصب نشده باشه اون رو نصب میکنه، یا اگر پکیجی نصب شده باشه که داخل require وجود نداشته باشه اون رو حذف میکنه و بقیه پکیج هارو هم اگر آخرین ورژنشون در دسترس باشه اونهارو نصب میکنه، و نهایتا اطلاعات جدید پکیج هارو در فایل composer.lock قرار میده.Composer requireبا استفاده از این کامند شما میتوانید یک پکیج را به بخش require ها در فایل کانفیگ اضافه کنید.Composer removeبا استفاده از این کامند نیز شما میتوانید پکیج مورد نظر خود را از بخش require های فایل کانفیگ حذف کنید، اگر هم نیاز داشته باشید تمام وابستگی های پکیج مورد نظرتون رو حذف کنید میتونید از دستور زیر استفاده کنید.composer remove vendor/packagename --update-with-dependenciesComposer outdated --directتمام پکیج هایی که منسوخ شده اند و توسط root package هاتون مورد استفاده اند رو نمایش میده.Composer dumpautoload مجددا فایل composer.json رو میخونه و یک لیست از تمام کلاس هایی که قراره include شوند در پروژه جمع آوری میکند (در فایل : autoload_classmap.php)مشخص کردن ورژن های خاص از پکیج هاشما برای مشخص کردن یک ورژن خاص از یک پکیج باید از Passing version ها استفاده کنید که بخشی از آنها را در تصویر زیر براتون قرار دادم.Passing versions in composerتشکر از اینکه وقت گذاشتید و تا اینجا مطالعه کردید، نظرتون رو برام حتما کامنت کنید و اگر دوست داشتید مقاله رو لایک کنید و اون رو به دوستاتون معرفی کنید.- برای عمیق تر شدن در مطالب این مقاله رو هم مطالعه کنید.ارادتمند شما مسعود هارونی</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>مسعود هارونی</author>
                <pubDate>Fri, 19 Aug 2022 17:32:39 +0430</pubDate>
            </item>
                    <item>
                <title>پکیج Laravel-attributes - ویژگی ها به صورت خیلی راحت در لاراول</title>
                <link>https://virgool.io/laravel-community/%D9%BE%DA%A9%DB%8C%D8%AC-laravel-attributes-%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%AE%DB%8C%D9%84%DB%8C-%D8%B1%D8%A7%D8%AD%D8%AA-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-c5qxaxas3sqv</link>
                <description>سلام بچه ها امروز یک پکیج درست کردم که مثل همیشه کار شما خیلی آسون میکنه.حالا پکیج چیه؟ این پکیج اسمش laravel-attributes هست که میاد براتون ویژگی ها به صورت خیلی راحت پیاده میکنه و دیگه نیازی به کلی کار نیست مثل طراحی دیتابیس اضافه کردن و .. این پکیج یک قابلیت باحال دیگه ای که داره این هست که شما میتونید چند تا ویژگی داشته باشید یعنی هم برای محصولات و هم برای مدل های دیگه.کل این کار ها با این پکیج اوکی میشهلطفا استار کنید و ازش استفاده کنید و نظرتون بگید خیلی ممنون از همگی که استقبال میکنیدhttps://github.com/milwad-dev/laravel-attributes</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>میلاد خسروی</author>
                <pubDate>Fri, 05 Aug 2022 00:41:15 +0430</pubDate>
            </item>
                    <item>
                <title>ثبت نام اولین بوت کمپ رایگان لاراول</title>
                <link>https://virgool.io/laravel-community/%D8%AB%D8%A8%D8%AA-%D9%86%D8%A7%D9%85-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%A8%D9%88%D8%AA-%DA%A9%D9%85%D9%BE-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-myjpucmii7ph</link>
                <description>باتوجه به درخواست مکرر کاربران برای ایجاد دوره های کارآموزی لاراول ما تصمیم گرفتیم به صورت تخصصی اولین بوت کمپ لاراول را به صورت کاملا رایگان برگزار کنیم و تحت هیچ عنوان هزینه ای دریافت نخواهد شد تا علاقه مندان و افرادی که در این حوزه انگیزه لازم را دارند فرصت حضور در بازار کار را داشته باشند . ثبت نام اولین بوت کمپ رایگان لاراول توسط جامعه توسعه دهندگان لاراولارزش تقریبی این دوره برپایه مدل ساعت نفر : هر نفر تقریبا 70 میلون تومان برآورد شده است که توسط اسپانسر دوره پرداخت خواهد شد .شرایط ثبت نام :‌- داشتن تایم کافی برای یادگیری- آشنایی کامل با HTML و CSS - آشنایی با php- اشنایی با laravel- آشنایی با gitمدت زمان دوره : حداکثر ۶ ماه خواهد بود البته تلاش ما براین هست که طول مدت دوره کمتر باشد تا فرد زودتر بتواند وارد بازار کار شوددوره به صورت دورکاری می باشد و نیازی به حضور در جایی نیست پس از تمامی استان ها امکان همکاری وجود دارد .نکته مهم : این بوت کمپ آموزشی دارای مصاحبه و آزمون می باشد و افرادی که انگیزه کافی برای یادگیری را دارند در این دوره جذب و آموزش های لازم در اختیارشان قرار داده می شود . تعدادی از کارجویان به اسپانسر معرفی خواهند شد ولی هیچ تضمینی برای استخدام وجود ندارداما در حوزه استخدام ما تمام تلاش ما را انجام میدهیم تا بتوانید وارد یک سازمان خوب شوید .حداقل حقوق براوردی بعد از یادگیری حدود : ۱۰ تا ۱۵ میلیون تومان می باشد .بعد از استخدام نیز هیچ هزینه ای تحت عنوان‌ آموزش و... نیازی نیست به مجموعه پرداخت نمایید .ارسال رزومه از طریق :‌https://alirezap30web.ir/online/مهلت ارسال رزومه تا ۱۵ مرداد ماه ۱۴۰۱</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Sat, 23 Jul 2022 09:24:47 +0430</pubDate>
            </item>
                    <item>
                <title>بزرگترین گروه برنامه نویسان لاراول در واتساپ</title>
                <link>https://virgool.io/laravel-community/%D8%A8%D8%B2%D8%B1%DA%AF%D8%AA%D8%B1%DB%8C%D9%86-%DA%AF%D8%B1%D9%88%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AF%D8%B1-%D9%88%D8%A7%D8%AA%D8%B3%D8%A7%D9%BE-z2vfgzqemtxc</link>
                <description>در یکی از پست های دیگه ای که توی ویرگول نوشته بودم در خصوص (سومین دورهمی بزرگ لاراول (مجازی)) به شما توضیح دادم که با رویداد هایی که در حوزه لاراول در حال برگزاری هستیم بیشتر اشنا بشیداون موقع فقط یک گروه ۶۰ نفره بودیم / و امروز : دوشنبه - ۳۰ خرداد ۱۴۰۱ ما یک گروه ۲۵۰ نفره هستیم و باعث افتخارم هست که توانستیم در عرض حدود ۲ ماه این رشد رو داشته باشیم شاید جالب باشه :‌ در این جا به چند تا از اتفاقات مهمی که در این ۲ ماه در جامعه توسعه دهندگان لاراول رخ داده است اشاره داشته باشیمبرخی از آمارهای هیجان انگیز جامعه توسعه دهندگان لاراول : جامعه توسعه دهندگان لاراول در ۲ ماه گذشته موفق به ایجاد اشتغال برای بیش از ۵۰ نفر برنامه نویس شده است !‌جامعه توسعه دهندگان لاراول در ۳ ماه گذشته ۲ بوت کمپ ۱۰ تا ۱۵ نفره کاملا رایگان برگزار کرده است و بیش از ۲۰ برنامه نویس تازه نفس را وارد بازار کرده است ایجاد اولین گروه استخدامی php/laravel در لینکدین تمامی کمپین های ما رشد بالای ۲۰۰ درصد را تجربه کرده اند در حوزه php/laravel موفق شدیم به بیش از ۴۰ ریپازیتوری اپن سورس لاراول کمک کنیم اعضای تیم راهبری جامعه توسعه دهندگان از ۵ نفر به ۱۵ نفر افزایش پیدا کرده است و ۱۵ نفر از موفق ترین برنامه نویسان ایرانی که بخشی از تیم ما خارج ایران هستند دارند تلاش میکنند که همه ما زندگی بهتری رو در حوزه لاراول داشته باشیم و...بهترین دستاورد گروه جامعه توسعه دهندگان لاراول در ۲ ماه گذشته :‌همه ما برنامه نویسان ایده ها و یا موضوعاتی رو داریم که دوست داریم روشون کار کنیم ولی تک و تنها نمی تونیم روی اون کار کنیم / در ۲ ماه گذشته بیش از ۱۰ تیم در این گروه شکل گرفت که تصمیم گرفتند با هم همکاری هایی رو شروع کنند گروهی که روی توسعه دیزاین پترن ها کار میکنندگروهی که دارند روی توسعه اولین پلتفرم ارزش گذاری برنامه نویسان کارمی کنندگروهی که دارند روی توسعه مخزن های اپن سورس کار میکنند و... اما این بزرگترین دستاورد ما نیست و در اینده در خصوص دستاورد های دیگر مون صحبت خواهیم کرد لینک گروه :‌اگر تمایل دارید شما هم عضو این گروه برنامه نویسی بشید میتوانید از لینک زیر استفاده کنید :‌عضویت در گروه واتساپ جامعه توسعه دهندگان لاراول ( php/lraravel)</description>
                <category>جامعه توسعه دهندگان لاراول</category>
                <author>علیرضا احمدی</author>
                <pubDate>Mon, 20 Jun 2022 09:00:11 +0430</pubDate>
            </item>
            </channel>
</rss>