<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد ملکی</title>
        <link>https://virgool.io/feed/@mlk9</link>
        <description>توسعه دهنده بک اند</description>
        <language>fa</language>
        <pubDate>2026-04-14 18:36:13</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1256343/avatar/kY14Sz.jpeg?height=120&amp;width=120</url>
            <title>محمد ملکی</title>
            <link>https://virgool.io/@mlk9</link>
        </image>

                    <item>
                <title>قابلیت جدید PHP 8.1 - آرایه unpack</title>
                <link>https://virgool.io/@mlk9/%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-%D8%AC%D8%AF%DB%8C%D8%AF-php-81-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-unpack-fwcpo9xrqab3</link>
                <description>قبلا در php 7.4 ، قابلیت unpack وجود داشت اما فقط برای آرایه لیست هایی با کلید ساده و عددی عمل می‌کرد اما در نسخه جدید این قابلیت اضافه شده که شامل همه آرایه ها میشود .حالا این قابلیت کجا کاربرد دارد؟ برای ترکیب آرایه ها باهم درست مثل جاوااسکریپت از ... قبل از مقدار ها استفاده میکنیم ؛ اما در نسخه ۷.۴ برای ترکیب آرایه های رشته ای باید از تابع array_merge استفاده میشد ، حال با این نسخه جدید این قابلیت بدون خطا قابل دسترس هست.بررسی همراه با مثالقبل از نسخه ۸.۱&lt;?php
$array = [0 =&gt; &#039;lorem&#039;,1=&gt;&#039;ipsum&#039;];
$array2 = [0 =&gt; &#039;amet&#039;];
$arrayMerged = [...$array,...$array2]; 
var_dump($arrayMerged); // [0 =&gt; &#039;lorem&#039;,1 =&gt; &#039;ipsum&#039; , 3 =&gt; &#039;amet&#039;]; $array1 = [&#039;x&#039; =&gt; &#039;y&#039;];
$array2 = [&#039;z&#039; =&gt; &#039;t&#039;]; 
$arrayMerged = [...$array1,...$array2]; 
var_dump($arrayMerged);// Fatal error: Cannot unpack array with string keys in ... on line ...
در نسخه 8.1 &lt;?php
$array = [0 =&gt; &#039;lorem&#039;,1=&gt;&#039;ipsum&#039;];
$array2 = [0 =&gt; &#039;amet&#039;];
$arrayMerged = [...$array,...$array2];
var_dump($arrayMerged);
// [0 =&gt; &#039;lorem&#039;,1 =&gt; &#039;ipsum&#039; , 3 =&gt; &#039;amet&#039;];

$array1 = [&#039;x&#039; =&gt; &#039;y&#039;];
$array2 = [&#039;z&#039; =&gt; &#039;t&#039;];
$arrayMerged = [...$array1,...$array2];
var_dump($arrayMerged);
//No Fatal error here :)این خطا دیگه وجود نداره !پس در نتیجه تا قبل نسخه 8.1 ، برای ترکیب آرایه های رشته ای می بایست از تابع array_merge استفاده میشد ولی حال با چند نقطه ساده این عمل انجام می شود همچون جاوااسکریپت . :)بررسی تابع array_is_list&lt;?php

$list = [&amp;quota&amp;quot, &amp;quotb&amp;quot, &amp;quotc&amp;quot];
array_is_list($list); // true
$notAList = [1 =&gt; &amp;quota&amp;quot, 2 =&gt; &amp;quotb&amp;quot, 3 =&gt; &amp;quotc&amp;quot];
array_is_list($notAList); // false
$alsoNotAList = [&amp;quota&amp;quot =&gt; &amp;quota&amp;quot, &amp;quotb&amp;quot =&gt; &amp;quotb&amp;quot, &amp;quotc&amp;quot =&gt; &amp;quotc&amp;quot];
array_is_list($alsoNotAList); // falseهمینطور که قابل مشاهده این تابع به صورت بولین هر لیستی که کلید ندارد را true و هر لیستی که به صورت رشته یا عدد هست را با خروجی false نمایش میدهد.</description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Sun, 27 Feb 2022 16:54:37 +0330</pubDate>
            </item>
                    <item>
                <title>کد امنیتی ( کپچا ) سفارشی برای لاراول</title>
                <link>https://virgool.io/@mlk9/%DA%A9%D8%AF-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%DA%A9%D9%BE%DA%86%D8%A7-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-xxmaxrkaatoq</link>
                <description>در این پست پس از مدت ها دوری از بلاگ قصد دارم ، آموزش یکی از ریپ هایی که قبلا نوشتم رو براتون بزارم .https://github.com/mlk9/captcha-laravelگاها در بعضی از پروژه ها نیاز هست که از تصویر امنیتی سبک استفاده بشه که نخوایم از ریکپچا گوگل و ... استفاده کنیم . این ریپازیتوری میتونه تصویر رو بر اساس پارامتر های تنظیمی و دلخواه بسازه و خروجی بده که کاملا با نسخه های لاراول 6 به بعد سازگار .نحوه نصببرای نصب این ریپ مثل بقیه پکیج هایی که برای کامپوزر و لاراول نوشته میشه در ترمینال مسیر پروژه این دستور رو وارد میکنیم :composer require mlk9/captcha-laravel سپس برای اینکه فایل های مربوط به کانفیگ این پکیج ساخته بشه ، این دستور رو میزنیم :php artisan vendor:publish --tag=captcha-laravelالان دیگه پکیج نصب شده و آماده استفاده هست .نحوه استفاده در فرم هابه این کد دقت کنید :&lt;div&gt;
    &lt;div&gt;
        &lt;div&gt;
             &lt;!-- Captcha generate --&gt;
            &lt;img src=&amp;quot{{ app(&#039;captcha&#039;)-&gt;generate() }}&amp;quot alt=&amp;quotcaptha&amp;quot&gt; 
        &lt;/div&gt;
		&lt;div&gt;
			&lt;div&gt;{{ __(&#039;captcha.captcha&#039;) }}&lt;/div&gt;
			&lt;input id=&amp;quotcaptcha&amp;quot name=&amp;quotcaptcha&amp;quot type=&amp;quottext&amp;quot required autocomplete=&amp;quotoff&amp;quot&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;همینطور که قابل مشاهده هست ما با دستور جنریت ، تصویر امنیتی مربوط رو درست کردیم و در ورودی فرم با نام کپچا اونو درخواست کردیم .در سمت کنترلر باید به این شکل عمل کنیم که ابتدا مقدار کد امنیتی مورد اعتبار سنجی قرار بگیره و سپس  الباقی کد رو اجرا کنه :captchaبا نصب پکیج اعتبار سنجی جدیدی به لیست اعتبارسنجی لاراول اضافه میشه که کپچا هست ، خیلی خب کافی هست موقع نوشتن اعتبار سنجی همانند string یا numeric  عبارت captcha رو موقع اعتبار سنجی این ورودی قرار بدیم.Illuminate\Support\Facades\Validator::validate($request-&gt;all(),
    [&amp;quotcaptchaField&amp;quot=&gt;&amp;quotcaptcha&amp;quot]
);یا اینکه به صورت قدیمی و غیر استانداردی که این پکیج تعبیه شده مثل روش زیر عمل کنیم (بستگی به موقیعت هم داره) :if(!app(&#039;captcha&#039;)-&gt;isValid($request-&gt;captcha))
{
    return back()-&gt;withErrors(&#039;Wrong Captcha&#039;);
}تنظیم تصویر امنیتیبرای تنظیم باید به مسیر زیر در پروژه بریم :config\captcha.phpدر این فایل میتونیم تصویر پس زمینه ، اندازه ها ، نوع کارکتر ها و تعداد آن و فونت کارکتر ها رو تعیین کنیم .</description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Sun, 20 Feb 2022 17:47:03 +0330</pubDate>
            </item>
                    <item>
                <title>میزان تاثیر گذاری زبان انگلیسی در برنامه نویسی</title>
                <link>https://virgool.io/applymag/%D9%85%DB%8C%D8%B2%D8%A7%D9%86-%D8%AA%D8%A7%D8%AB%DB%8C%D8%B1-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-ngqehoy8l6rf</link>
                <description>سلام دنیا !اصولا ما در برنامه نویسی از حروف و کلمات انگلیسی برای پیاده سازی کد های خود استفاده میکنیم . منظور از این مقاله بررسی تمام تاثیر گذاری های مستقیم و غیر مستقیم زبان بر کار ما یعنی برنامه نویسی هست :در فرایند یادگیری در فرایند توسعه شخصی و ارتباط با جامعه های برنامه نویساندر فرایند پیدا کردن پیشنهاد های جدیدزبان انگلیسی در فرایند یادگیریشاید شما هم اولین نکته ای که از این تیتر به فکرتون بیاد ، یوتیوب هست. یوتیوب یکی از بهترین منابع رایگان برای برنامه نویسی هست اما نباید از این غافل شد که مستندات و توضیحات ارائه دهنده محصولات همانند لاراول ، پکیج ها ، نود و ... به شما کمک خواهند کرد به صورت عمیق تری مفاهیم رو بررسی کنید.خیلی از ویدیو ها دارای اشتباهات و محتوای سطحی از مستندات ارائه می دهند و در واقع بخشی از اون رو توضیح میدن . این مورد در خیلی از ویدیو های آموزشی غیر رایگان رو نیز شاهد بود ، پس مثل دوران دانشگاه مستند اصلی کتاب [مستندات] هست ... .همچنین در کنار این موارد عملکرد خیلی از متد ها از معنی لغوی آنهاست و قابلیت برداشت سریع تری خواهد داشت و نیاز به تفکر چندین ساعتی درباره نحوه کار با اونها نخواهد بود .زبان انگلیسی در فرایند توسعه شخصی و ارتباط با جامعه های برنامه نویساندر خیلی از مواقع ما به پیچ خم های زیادی در پروژه ها برخورد میکنیم که احتمالا با جستجو به صورت فارسی قابل دسترس نخواهد بود ، بهتره بگم بعضی مشکلات به صورت رایج در محصولات وجود دارند و فقط این مسائل در سایت و یا گیت هاب و یا انجمن ها قابل یافتن هستند که بیشتر آنها به زبان انگلیسی در دسترس هستند.بعضی وقت ها با خواندن مقالات استاندارد برنامه نویسی ، نکات جالبی راجب کد زدن در میابیم که حتی در مستندات وجود ندارند که به عملکرد بهتر ما کمک می کنند.تا حالا فکر کردید که با یادگیری زبان خیلی راحت میتونین با توسعه دهندگان ارتباط برقرار کرده کد ها و کامنت های اون ها رو بخونین و براحتی هر چه تموم تر ، به اصلاحات باگ ها در جامعه کمک کنید و دوست های خوبی پیدا کنین ، یا اینکه خود شما با ارائه توضیحات درست و مستندات صحیح به دیگران ، به توسعه محصولات خود کمک کنین .در فرایند پیدا کردن پیشنهاد های جدیددر رزومه یکی از بخش های مهم ، زبان هایی هست که میتونیم صحبت کنیم . مخصوصا اگر قصد مهاجرت کاری دارید نیاز که به خوبی با همکاران و مشتریان ارتباط برقرار کنین . همین به شما کمک میکنه که اعتبار کافی و شبکه از افراد مفید را به خود جذب کنید.در موقع اپلای لازم هست رزومه و توصیه نامه و کاورلتر خود را به انگلیسی و شخصی سازی شده ارائه دهید تا شانس بیشتری نسبت به بقیه داشته باشید ، حتی یک غلط املایی این وسط شانس شما رو از بین خواهد برد.همچنین در بعضی از شرکت های برتر ایرانی داشتن مدرک زبان و یا صحبت کردن به صورت روان به نوعی امتیاز مثبت در استخدام حساب میشود.هدفتان چیست ؟اگر بی هدف فقط کد میزنین ، این مقاله به درد شما نخواهد خورد . با خودتون رو راست باشین و هدفی عالی در زندگی تعیین کنین . زبان ابزار مناسبی برای کسب درامد و هدفمندی در زندگی خصوصی و عمومی هست . اگر دریادگیری خسته و بی حوصله میشوید ، نحوه مطالعه و ریتم زندگی خودتون تغییر بدین و شکل عادت های زندگی کم به کم عوض کنین .هرگز نا امید نباشید ...</description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Sat, 04 Dec 2021 19:30:59 +0330</pubDate>
            </item>
                    <item>
                <title>بخشی از سیستم تست در لاراول به صورت ساده</title>
                <link>https://virgool.io/laravel-community/%D8%A8%D8%AE%D8%B4%DB%8C-%D8%A7%D8%B2-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%AA%D8%B3%D8%AA-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%B3%D8%A7%D8%AF%D9%87-nnksczjm7i3b</link>
                <description>ساختاردر فایل testunit.xml در مسیر اصلی پروژه ما ساختار زیر را داریم :&lt;testsuites&gt;
         &lt;testsuite name=&amp;quotUnit&amp;quot&gt;
           &lt;directory suffix=&amp;quotTest.php&amp;quot&gt;./tests/Unit&lt;/directory&gt;
         &lt;/testsuite&gt;
         &lt;testsuite name=&amp;quotFeature&amp;quot&gt;
             &lt;directory suffix=&amp;quotTest.php&amp;quot&gt;./tests/Feature&lt;/directory&gt;
         &lt;/testsuite&gt;
&lt;/testsuites&gt;ما در اینجا دو کیس دیفالت برای تست داریم و طبق این ساختار کافیه خدمون یکی جدید بهش اضافه کنیم :&lt;testsuites&gt;
          &lt;testsuite name=&amp;quotUnit&amp;quot&gt;
            &lt;directory suffix=&amp;quotTest.php&amp;quot&gt;./tests/Unit&lt;/directory&gt;
          &lt;/testsuite&gt;
          &lt;testsuite name=&amp;quotFeature&amp;quot&gt;
              &lt;directory suffix=&amp;quotTest.php&amp;quot&gt;./tests/Feature&lt;/directory&gt;
          &lt;/testsuite&gt;
          &lt;testsuite name=&amp;quotMytest&amp;quot&gt; 
              &lt;directory suffix=&amp;quotTest.php&amp;quot&gt;./tests/Mytest&lt;/directory&gt;
           &lt;/testsuite&gt;
 &lt;/testsuites&gt;خب ما با توجه به مسیری که دادیم فولدری با نام Mytest در مسیر tests در پوشه پروژه می سازیم و فایل های تست خدمون رو داخلش مینویسیم .اجرای دستور تست جهت اجرای تمامی کیس های تست با دستور زیر همگی استارت میشن :php artisan testو برای اجرای یک کیس خاص دستور به این شکل می شود :php artisan test --testsuite=Mytestبرای اینکه اگر در هنگام تست به خطا خورد ، بقیه عملیات متوقف بشه دستور رو به این شکل تغییر میدیم :php artisan test --testsuite=Mytest --stop-on-failureفایل های تست&lt;?php 

namespace Tests\Mytest; 

use Illuminate\Foundation\Testing\RefreshDatabase; 
use Tests\TestCase; 

class RouteTest extends TestCase 
{ 
/** 
* A basic test example.
 * * @return void 
*/ 
public function test_route()
 { 
$response = $this-&gt;get(&#039;/&#039;);

$response-&gt;assertStatus(200); 
}
 } در مثال فوق  ما یک فایل جدید درپوشه Mytest خودمون با نام RouteTest.php می سازیم و کد های بالا رو داخلش پیست میکنیم.حتما به نام گذاری متد ها و کلاس دقت کنین چون در یک کلاس میشه چند تا تست انجام بشه مثلا در همین تست ، میتونیم دو متد با نام های test_login_route و test_register_route داشته باشیمکد بالا چک میکنه که آیا مسیری که مشخص شده درست باز میشه یا خیر و در نهایت اگر درسته باز بشه با پیام سبز در تست های مشخص خواهد شد.خود لاراول از سیستم php unit برای تست ها استفاده میکنه که برای آشنایی با متد های این ابزار کافیه داکیومنتشو بخونین :https://phpunit.readthedocs.io/en/9.5/همچنین توضیحات راجب تست کردن در لاراول رو میتونین در این صفحه از لاراول مشاهده کنین :https://laravel.com/docs/8.x/testingامیدوارم خیلی ساده تونسته باشم سیستم تست در لاراول رو براتون توضیح داده باشم .در آخر مثل همیشه چند منبع برای یادگیری بیشتر :https://semaphoreci.com/community/tutorials/getting-started-with-phpunit-in-laravelhttps://soshace.com/testing-laravel-applications-like-a-pro-with-phpunit/</description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Mon, 25 Oct 2021 22:47:53 +0330</pubDate>
            </item>
                    <item>
                <title>Curry در پی اچ پی</title>
                <link>https://virgool.io/@mlk9/curry-%D8%AF%D8%B1-%D9%BE%DB%8C-%D8%A7%DA%86-%D9%BE%DB%8C-sqd9px4mdhyt</link>
                <description>Curry چیه و چیکار میکنه ؟شما میتونین با این روش کدنویسی به گونه ای به یک متد آرگومان تزریق کنین که در هر مرحله یک مقدار به متد اضافه بشه و در نهایت عملیات نهایی انجام بشه . به طور مثال ما یک متد داریم که وظیفه مرج کردن چند داده رو داره که این کار رو میشه به دو روش انجام داد.&lt;?php 
//Method 1
function mergeResults($arg1,$arg2,$arg3)
{
    return [
        &#039;res1&#039; =&gt; $arg1,
        &#039;res2&#039; =&gt; $arg2,
        &#039;res3&#039; =&gt; $arg3,
    ];
}
$result1 = [1]; 
$result2 = [2]; 
$result3 = [3]; 
var_dump(mergeResults($result1,$result2,$result3));//Method 2
function mergeResultsCurry($arg1)
{
    return function ($arg2) use ($arg1)
    {
        return function ($arg3) use ($arg1,$arg2)
        {
            return [
                &#039;res1&#039; =&gt; $arg1,
                &#039;res2&#039; =&gt; $arg2,
                &#039;res3&#039; =&gt; $arg3,
            ];
        };
    };
}
$result1 = [1]; 
$res = mergeResultsCurry($result1);
$result2 = [2]; 
$res2 = $res($result2);
$result3 = [3]; 
$res3 = $res2($result3);
$result4 = [4]; 
$res4 = $res2($result4);
var_dump($res3);
// var_dump($res4);خب فکر کنم همینجا معلوم شد که curry چیکار می کنه برامون :توی روش اول نیاز همه نتایج آماده بشه و در نهایت توی متد فراخوانی بشه و کلی باید برنامه منتظر بمونه برای 3 پروسه که آیا با خطا باشه یا نباشه اما توی روش دوم نتایج مرحله به مرحله اضافه میشه به متد و اینکه حتی میتونید خروجی های مختلفی از مراحل قبل تر برای داده جدید بگیرید .کاربرددر اینجا حتما میگین کاربرد این روش چیه ؟؟؟ خب باید بگم که توی پروسه های ذخیره سازی ، جلوگیری از تکرار کار بیهوده برای چند خروجی مختلف از داده های ثابت به عنوان مثال مسیردهی و دیباگ کردن و ... مثال های بیشتر https://medium.com/nerd-for-tech/functional-programming-in-php-part-2-currying-2353b71dbe7ahttps://stackoverflow.com/questions/1609985/is-it-possible-to-curry-method-calls-in-phphttps://zaemis.blogspot.com/2009/06/currying-in-php.htmlامیدوارم با این مقاله بتونین کد های بهینه و تمیز تر داشته باشید ... . </description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Wed, 20 Oct 2021 10:20:01 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از تاریخ شمسی در بک اند</title>
                <link>https://virgool.io/@mlk9/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%B4%D9%85%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%A8%DA%A9-%D8%A7%D9%86%D8%AF-d7vzajnmrtde</link>
                <description>اول از هر چیزی باید به این موضوع نگاه کرد که برای چه قصدی میخواهید تاریخ رو به شمسی نمایش بدین ؟ عموما برای این چند تا قصد : 1-یک دیتا ثابت که قصد نداریم تغییر خاصی روش بدیم 2-یک دیتا که قراره ازش بعدا خروجی های گوناگون بگیریم و شرط بزاریم و ...1- یک دیتا ایستا فقط برای نمایش :خب توصیه من برای اینطور دیتا ها استفاده از همون دیتا شمسی و ذخیره همینطوری اون داخل دیتابیس هست ، با این کار می تونیم سرعت و تعداد درخواست ها رو بهینه کنیم . حالا می پرسین چطور میشه این کارو کرد که فقط کاربر بتونه تاریخ شمسی استفاده بکنه ؟جواب این سوال واضح هست باید اعتبارسنجی گذاشته بشه و هم در کنارش در سمت فرانت از ابزار های انتخاب تاریخ برای سهولت کاربر استفاده بشه .برای نمایش اون هم به کاربران دارای دسترسی یا خود اون شخص فقط کافیه در ابتدا دیتا به صورت رشته ذخیره و بعدا هم همون دیتا نمایش داده بشه.2- دیتا هایی که قصد انجام عملیات و شرطی کردن داریم :بهتره که این دیتا ها به صورت تایم استمپ در دیتابیس استفاده بشه ، مزیت این کار این هست که بعدا به راحتی در هر سیستم و فریمورکی که هستیم میتونیم به طور مثال دو ساعت به اون اضافه کنیم یا شروط دیگری مثل بررسی بزرگتر بودن تاریخ از فلان تاریخ انجام بدیم .بحثی که بنظرم اینجا خیلی مهم بعد از انجام کار های مختلف روی تاریخ برای نمایشش تا اونجا که ممکن باید سمت کاربر اون تاریخ به شمسی تبدیل بشه و فقط اون بخش هایی که باید عملیات خاصی انجام بشه مثل ارسال نوتیفیکیشن سمت سرور تاریخ به شمسی تبدیل بشه .با تبدیل تاریخ به شمسی در سمت کاربر ، سرعت و تعداد رکوئست ها کاهش پیدا میکنه و همینطور از خطاهای احتمالی که ممکن بعضی از پکیج ها در سمت بک اند انجام میشه جان سالم بدر ببریم .امیدوارم در پایان این مقاله کدهاتون بهینه تر بشه و استفاده کرده باشین</description>
                <category>محمد ملکی</category>
                <author>محمد ملکی</author>
                <pubDate>Wed, 13 Oct 2021 20:17:22 +0330</pubDate>
            </item>
            </channel>
</rss>