<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حمید روحانی</title>
        <link>https://virgool.io/feed/@hamidroohani</link>
        <description>PHP Developer - Web Developer</description>
        <language>fa</language>
        <pubDate>2026-06-16 19:51:17</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1119111/avatar/nQbGAl.jpeg?height=120&amp;width=120</url>
            <title>حمید روحانی</title>
            <link>https://virgool.io/@hamidroohani</link>
        </image>

                    <item>
                <title>شغل‌های برنامه‌نویسی گرفته می‌شوند، اما نه توسط هوش مصنوعی</title>
                <link>https://virgool.io/@hamidroohani/%D8%B4%D8%BA%D9%84-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%AF%D8%B1%D9%81%D8%AA%D9%87-%D9%85%DB%8C-%D8%B4%D9%88%D9%86%D8%AF-%D8%A7%D9%85%D8%A7-%D9%86%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-ipbfuy8xnafg</link>
                <description>امروزه بحث‌های زیادی پیرامون این موضوع وجود دارد که آیا هوش مصنوعی شغل‌های برنامه‌نویسی را از بین خواهد برد؟ در نگاه اول شاید چنین به نظر برسد که هوش مصنوعی قادر است بسیاری از وظایف برنامه‌نویسان را انجام دهد. اما حقیقت این است که علت کاهش فرصت‌های شغلی در حوزه برنامه‌نویسی بیشتر به دلیل عوامل اقتصادی است تا هوش مصنوعی.یکی از اصلی‌ترین دلایل کاهش فرصت‌های شغلی برای برنامه‌نویسان، کوچک شدن اقتصاد و محدودیت‌های بودجه‌ای است. شرکت‌ها در حال تجدید نظر در استراتژی‌ها و بودجه‌های خود هستند و برای کاهش هزینه‌ها به سمت استفاده از سیستم‌های آماده و اشتراک‌های SaaS روی می‌آورند. این سیستم‌ها شامل پلتفرم‌هایی مانند Shopify، WordPress و Wix هستند که بسیاری از نیازهای تجاری را با هزینه کم و بدون نیاز به استخدام برنامه‌نویس برطرف می‌کنند.در سال‌های اخیر، به ویژه برای کسب‌وکارهای کوچک، استفاده از این راهکارهای آماده منطقی‌تر شده است. آنها ترجیح می‌دهند به جای استخدام برنامه‌نویس و پرداخت حقوق‌های بالا، از این پلتفرم‌های آماده با اشتراک ماهیانه استفاده کنند. علاوه بر این، حتی در پروژه‌های برنامه‌نویسی نیز ابزارهای زیادی وجود دارند که فرآیند توسعه را سرعت می‌بخشند و نیازی به توسعه‌دهندگان بیشتر احساس نمی‌شود.مثلاً اگر کسب‌وکاری بخواهد یک پروژه SaaS برای فروش دوره‌های آموزشی ایجاد کند، می‌تواند از ابزارهایی مثل Laravel Spark، Jetstream و Filament استفاده کند و با کمترین میزان توسعه‌، سیستم مورد نیاز خود را راه‌اندازی کند.در نهایت، این موضوع به یک حقیقت دیگر نیز اشاره دارد: مشاغل برنامه‌نویسی بیش از آن که توسط هوش مصنوعی از بین بروند، توسط تغییرات بازار و انتخاب‌های هوشمندانه کسب‌وکارها کاهش می‌یابند. این کسب‌وکارها به دنبال کاهش هزینه‌ها هستند و تا جایی که ممکن است از استخدام توسعه‌دهندگان خودداری می‌کنند. به جای آن، بیشتر تمرکز بر استفاده از ابزارهای آماده و پلتفرم‌های ابری است.با این حال، این بدان معنا نیست که آینده شغلی برای برنامه‌نویسان تیره و تار است. برای برنامه‌نویسانی که می‌خواهند همچنان در این بازار رقابت کنند، بهترین راهکار این است که مهارت‌های خود را به‌روز نگه‌دارند و از تغییرات جدید در بازار استفاده کنند. ارتقای مهارت‌ها در زمینه‌هایی مثل زیرساخت‌ها و ابزارهای نوین توسعه، می‌تواند آنها را به برنامه‌نویسانی با ارزش‌تر برای کسب‌وکارهای بزرگ‌تر تبدیل کند.این مقاله بر اساس دیدگاه‌های فردی که تجربه خود در بازار کار برنامه‌نویسی را به اشتراک گذاشته، نوشته شده است.منبع: https://youtu.be/scwL_GJEsTM?si=_uWFQPc2Mm7sKMNJ</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Fri, 20 Sep 2024 11:55:57 +0330</pubDate>
            </item>
                    <item>
                <title>ایجاد درخواست های نامتقارن در php و لاراول - Send an asynchronous request with Guzzle</title>
                <link>https://virgool.io/@hamidroohani/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D8%AF%D8%B1%D8%AE%D9%88%D8%A7%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D9%85%D8%AA%D9%82%D8%A7%D8%B1%D9%86-%D8%AF%D8%B1-php-%D9%88-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-send-an-asynchronous-request-with-guzzle-kw3uuvbpbcmq</link>
                <description>امروزه درخواست های نامتقارن (Async) بسیار مهم هستند و همه زبان های برنامه نویسی بزرگ سعی می کنند این امکان را به توسعه دهندگان خود بدهند.شاید بخواهید درخواستی ارسال کنید و در واقع نمی خواهید منتظر پاسخ آن درخواست باشید، بنابراین درخواست های نامتقارن می توانند در این شرایط به شما کمک کنند.اول از همه، باید یک handler و یک شی از client ایجاد کنیم.use GuzzleHttp\Client;
use GuzzleHttp\Handler\CurlMultiHandler;

$handler = new CurlMultiHandler();
$client = new Client([&#039;handler&#039; =&gt; $handler]);پس از آن می خواهیم در همان صفحه درخواست ارسال را فراخوانی کنیم.$client-&gt;postAsync($this-&gt;url, [
    &#039;headers&#039; =&gt; [
        // هدر مربوطه را اینجا مینویسیم
    ],
    &#039;json&#039; =&gt; [
        // بدنه درخواست را اینجا می نویسیم
    ]
])
    -&gt;then(function ($result) {
        // اگر درخواست با موفقیت انجام شود این قسمت از برنامه اجرا خواهد شد.
    })
    -&gt;otherwise(function ($reason){
        // اگر درخواست به خطا بخورد این قسمت از برنامه اجرا خواهد شد.
    });بعد از postAsync دو نوع متد callback وجود دارد که متد then یک تابع دریافت می کند و نتیجه را به تابع برمیگرداند.بنابراین در صورت موفقیت آمیز بودن درخواست، کد شما در متد then اجرا خواهد شد.و همچنین در صورت وجود هر گونه خطایی، کد شما در متد otherwise اجرا خواهد شد.برای اجرای درخواست async باید هندلری را که قبلا ایجاد شده بود فراخوانی کنید و متدی به نام tick را فراخوانی کنید.$handler-&gt;tick();توجه: guzzle فقط برای لاراول نیست و می‌توانید در همه جا درکنار PHP از آن استفاده کنید.تمامی کد:use GuzzleHttp\Client;
use GuzzleHttp\Handler\CurlMultiHandler;$handler = new CurlMultiHandler();
$client = new Client([&#039;handler&#039; =&gt; $handler]);$client-&gt;postAsync($this-&gt;url, [&#039;headers&#039; =&gt; [
        // header will be here
    ],&#039;json&#039; =&gt; [
        // body will be here
    ]])-&gt;then(function ($result) {
    // request returned successfully with results
})-&gt;otherwise(function ($reason){
    // The request was not complete and there are some reasons
});$handler-&gt;tick();موفق باشیدحمید روحانی</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Wed, 16 Feb 2022 16:16:57 +0330</pubDate>
            </item>
                    <item>
                <title>ایندکس گذاری تکست در لاراول ۹ - larvel 9 full index text</title>
                <link>https://virgool.io/@hamidroohani/%D8%A7%DB%8C%D9%86%D8%AF%DA%A9%D8%B3-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%AA%DA%A9%D8%B3%D8%AA-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%DB%B9-larvel-9-full-index-text-yhwuaclmatlr</link>
                <description>طرح مسئله: در دیتابیس های مثل mysql شما برای جستجوی در یک متن طولانی از like و % استفاده میکردید، مثال:select * from users where bio like %web developer%;عیب این نوع سرچ کردن، سرعت و پرفرمنس بسیار پایین در کوئری شما ست، بخاطر اینکه موتور دیتابیس شما سعی میکنه همه متن شما رو optimize کنه و نهایتا در اون جستجو کنهراه حل در لاراول ۹:استفاده از full index text و در الکوئنت where full text − قدم اول در مایگریشن$table-&gt;text(&#039;body&#039;)-&gt;fulltext();با این کار موتور دیتابیس mysql میاد و متن رو تبدیل به کلمات میکنه و تک تک اونها رو ایندکس گذاری میکنه و نه تمام متن رو بصورت یکجا− قدم بعدی نحوه کوئری زدن در لاراول$users = DB::table(&#039;users&#039;) 
     -&gt;whereFullText(&#039;bio&#039;, &#039;web developer&#039;) 
          -&gt;get();این روش پرفرمنس و سرعت به مراتب بالاتری نسبت به روش قبلی دارهجاست لایک دت و یا به همین راحتی (:پ ن: لازم به ذکره که بدونید این کوئری معادل MATCH () ... AGAINST در mysql هست.حمید روحانی</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Mon, 14 Feb 2022 16:48:41 +0330</pubDate>
            </item>
                    <item>
                <title>دسته بندی روت ها در لاراول ۹ با معیار کنترلر - laravel 9 controller route group</title>
                <link>https://virgool.io/@hamidroohani/%D8%AF%D8%B3%D8%AA%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D8%B1%D9%88%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%DB%B9-%D8%A8%D8%A7-%D9%85%D8%B9%DB%8C%D8%A7%D8%B1-%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-laravel-9-controller-route-group-v4ql3vohyapa</link>
                <description>در ورژن های قبلی لاراول قابلیت دسته بندی و یا group کردن روت route ها وجود داشت، اما اونها معمولا با قسمت مشترکی از url به شکل گروهی در میومدنتوی ورژن ۹ لاراول ما میتونیم همه روت های مربوط یه یک کنترلر controller رو با هم دسته بندی و یا group کنیم.ورژن های ماقبل لاراول۹Route::get(&#039;/posts&#039;,[PostsController::class,&#039;index&#039;]);
Route::get(&#039;/posts/{post}&#039;,[PostsController::class,&#039;show&#039;]);
Route::post(&#039;/posts&#039;,[PostsController::class,&#039;store&#039;]);ولی در ورژن ۹ لاراول میتونیم به این شکل روت هامون رو گروه بندی کنیمRoute::controller(PostsController::class)-&gt;group(function (){
    Route::get(&#039;/posts&#039;,&#039;index&#039;);
    Route::get(&#039;/posts/{post}&#039;,&#039;show&#039;);
    Route::post(&#039;/posts&#039;,&#039;store&#039;);
});موفق باشید (:حمید روحانی</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Mon, 14 Feb 2022 16:22:48 +0330</pubDate>
            </item>
                    <item>
                <title>جستجو در لاراول ۹ با استفاده از موتور Laravel scout</title>
                <link>https://virgool.io/@hamidroohani/%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%DB%B9-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%D9%88%D8%AA%D9%88%D8%B1-laravel-scout-iwxpw9efyrwp</link>
                <description>دوست دارید در توسعه پروژه لاراولی یک راه حل بسیار ساده برای جستجو در متن های دیتابیس تون داشته باشید؟لاراول ۹ این قابلیت رو به شما میدهلاراول اسکات یک راه حل ساده و مبتنی بر درایور جهت سرچ در متن به شما ارائه میدهاین مورد در الکوئنت مدل های شما بسیار پرکاربرده.درایورهای مختلفی میتونه داشته باشه ائم از Algolia, MeiliSearch, and MySQL / PostgreSQL (database)قدم اول: نصب لاراول اسکات با کامپوزرcomposer require laravel/scout۲. پس از نصب Scout، باید فایل تنظیمات Scout را با استفاده از دستور مخصوص آرتیسان پابلیش کنید. این دستور فایل تنظیمات scout.php را در دایرکتوری config برنامه شما منتشر می کند:php artisan vendor:publish --provider=&amp;quotLaravel\Scout\ScoutServiceProvider&amp;quot۳. مشخص کردن درایور اسکات در فایل .envSCOUT_DRIVER=database۴. و در انتها باید در مدل مربوط به جدول مد نظرتون use کنید از کلاسی با نام Searchable&lt;?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable;class Post extends Model{              use Searchable;}به همین راحتی کار ما در این مرحله تموم شد و در مرحله بعد میریم نحوه صدا زدن و استفاده ازش رو بگیمبا استفاده از دستور زیر میتونیم خروجی سرچ مون رو بگیریم و یا صفحه بندی کنیم و یا هر بلایی که دلمون میخواد سرش بیاریم.Post::search(&#039;&lt;search-text&gt;&#039;)-&gt;paginate();اگر جالب بود برای دوستاتون بفرستید. (;حمید روحانی</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Mon, 14 Feb 2022 14:22:12 +0330</pubDate>
            </item>
                    <item>
                <title>laravel 9 - forced scoped bindings لاراول ۹</title>
                <link>https://virgool.io/@hamidroohani/laravel-9-forced-scoped-bindings-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%DB%B9-np1tyqvqqbgi</link>
                <description>یکی از قابلیت های جذاب لاراول ۹ همین forced scope bindings هست که یه جورایی به معنای اتصال اجباری  و ... معنی میشهخب حالا این یعنی چی؟کسایی که قبلا تجربه توسعه داشتند میدونند که بعضا ما میخوایم در لحظه نمایش پست ها و یا محصولات و یا هر چیز دیگه ای، قبلش چک کنیم که این پست متعلق به یوزر فعلی باشه، یعنی کاربرای دیگه نتونن پست های دیگران رو ببینند.بیاین توی کد نشونتون بدمقدم اول ساخت مایگریشنphp artisan make:migration create_posts_tablepublic function up()
{
    Schema::create(&#039;posts&#039;, function (Blueprint $table) {
        $table-&gt;id();
        $table-&gt;foreignIdFor(\App\Models\User::Class)-&gt;constrained()-&gt;onDelete(&#039;cascade&#039;);
        $table-&gt;string(&#039;title&#039;);
        $table-&gt;text(&#039;body&#039;);
        $table-&gt;timestamps();
    });
}جالب هست بدونید با foreignIdFor میتونید به راحتی کلید خارجی بسازید و به تیبل مورد نظرتون بایندش کنید.بریم سراغ وارد کردن دیتا داخل جدول پست هاجدول پست هاتوی جدول فوق میبینید که ما ۱۰ تا پست داریم و ۱۰ تا یوزر و هر یوزر یک پست در جدول ما داره - خیلی ساده -هدف: یوزر شماره ۱ پست اول را بتواند ببیند و پست های دیگر را نتواند ببیند۲. مرحله بعد تعریف روت route− حالت قبل از لاراول ۹تعریف روت نمایش پستتوی این حالت تمام پست ها بدون محدودیت قابل نمایش هستپست شماره ۱ که مربوط به یوزر شماره ۱ می باشدپست شماره ۹ که مربوط به یوزر شماره  نمی باشدمی بینید که توی این حالت با پاس دادن آی دی پست به یو آر ال میتونیم بدون هیچ محدودیتی پست رو ببینینم− و اما حالت forced scope bindingsافزودن آی دی به انتهای متغیر پستشما با این کار حالت force bind رو فعال می کنید و دیگه کاربر شماره ۱ نمیتونه پست شماره ۹ رو ببینهپست شماره ۹ که مربوط به یوزر شماره ۱ نیستبه همین راحتی (:در روتر یک راه حل دیگه هم داریم اونم اضافه کردن scopebindings انتهای روتمون هست بدین شکل:امیدوارم مفید باشه براتون ((:حمید روحانی</description>
                <category>حمید روحانی</category>
                <author>حمید روحانی</author>
                <pubDate>Mon, 14 Feb 2022 12:11:39 +0330</pubDate>
            </item>
            </channel>
</rss>