<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های fouladgar.dev</title><link>https://virgool.ir/feed/@fouladgar.dev</link><description>Back-End Developer</description><language>fa</language><pubDate>2026-11-10 19:56:01</pubDate><image><url>https://files.virgool.ir/upload/users/11188/avatar/dcukcl.jpeg</url><title>fouladgar.dev</title><link>https://virgool.ir/@fouladgar.dev</link></image><item><title>احراز هویت کاربران با رمز یکبار مصرف (OTP)  در لاراول</title><link>https://virgool.ir/@fouladgar.dev/اهراز-هویت-کاربران-با-رمز-یکبار-مصرف-otp-در-لاراول-xw7ha2qvqrce</link><description>وقت طلاست!امروزه اکثر برنامه‌های کاربردی تحت وب ترجیح می‌دهند به جای استفاده از نام کاربری/رمز عبور که یک سیستم احراز هویت کلاسیک برای اعتبارسنجی کاربران بود، از OTP استفاده کنند. زیرا، این راه امن تر است و برخلاف رمزهای عبور استاتیک، در برابر حملات مجدد آسیب پذیر نیستند.شاید شما نیز دغدغه ی پیاده سازی رمز عبور یک بار مصرف را به عنوان یک توسعه دهنده وب در فریم ورک لاراول را داشته باشید.دغدغه هایی از قبیل:چگونه می توانم یک توکن امن تولید کنم؟توکن تولید شده را کجا باید ذخیره کنم؟آیا توکن معتبر است یا خیر؟ آیا توکن منقضی شده است یا خیر؟چگونه می توانم یک سیستم یکپارچه و همچنین قابل استفاده برای سطوح کاربران مختلف داشته باشم؟و غیره...خب، یک خبر خوب!  ما به تازگی پکیجی ای را  منتشر کرده ایم که میتوانید به راحتی احراز هویت کاربران خود را با رمز یکبار مصرف در فریم ورک لاراول پیاده سازی کنید. https://github.com/mohammad-fouladgar/laravel-otp روش های استفادهدر اینجا مثال هایی از روش های استفاده رو باهم مرور میکنیم و در ادامه مراحل نصب و پیاده سازی رو پیش می بریم:&#xA; # Send OTP via SMS.&#xA;OTP()-&gt;send(&#39;09130000000&#39;);&#xA;# OR&#xA;OTP(&#39;09130000000&#39;);&#xA;&#xA; # Send OTP via channels.&#xA;OTP()-&gt;channel([&#39;otp_sms&#39;, &#39;mail&#39;, \CustomSMSChannel::class])-&gt;send(&#39;09130000000&#39;);&#xA;# OR&#xA;OTP(&#39;09130000000&#39;, [&#39;otp_sms&#39;, &#39;mail&#39;, \CustomSMSChannel::class]);&#xA;&#xA;# Send OTP for specific user provider&#xA;OTP()-&gt;useProvider(&#39;admins&#39;)-&gt;send(&#39;09130000000&#39;);&#xA;&#xA;# Validate OTP&#xA;OTP()-&gt;validate(&#39;09130000000&#39;, &#39;token_123&#39;);&#xA;# OR&#xA;OTP(&#39;09130000000&#39;, &#39;token_123&#39;);&#xA;# OR&#xA;OTP()-&gt;useProvider(&#39;users&#39;)-&gt;validate(&#39;09130000000&#39;, &#39;token_123&#39;);شروعابتدا باید پکیج لاراول OTP را از طریق composer نصب کنید:composer require fouladgar/laravel-otpسپس، فایل config/otp.php را با اجرای دستور زیر منتشر کنید:php artisan vendor:publish --provider=&#34;Fouladgar\OTP\ServiceProvider&#34; --tag=&#34;config&#34;آماده سازی مدلدر مرحله بعد، مطمئن شوید که مدل مورد نظر اینترفیس Fouladgar\OTP\Contracts\OTPNotifiable را پیاده سازی کرده و همچنین از تریت Fouladgar\OTP\Concerns\HasOTPNotify استفاده می کند: https://gist.github.com/mohammad-fouladgar/802830fcde11e557b91ce0cf8eb8b78f#file-user-php یک OTPSMSCchannel پیش‌فرض وجود دارد که برای ارسال توکن تولید شده به کاربر، به یک  SMSClient نیاز دارد. پس باید ابتدا SMSClient خود را مشخص کرده و اینترفیس Fouladgar\OTP\Contracts\SMSClient را پیاده سازی کنید. این اینترفیس شما را ملزم به پیاده سازی متد sendMessage می کند.این متد  شامل یک آبجکتی است که حاوی mobile و OTP کاربر میباشد که میتوانید با استفاده از سرویس SMS  خود آنها را ارسال کنید. https://gist.github.com/mohammad-fouladgar/43539893a02ab26eda59501e08f3af42#file-samplesmsclient-php در مرحله بعد، باید کلاس  SampleSMSClient را در فایل config/otp.php ست کنید: https://gist.github.com/mohammad-fouladgar/aec20546fa81e33707ffc9a7908de415#file-sms_client_config-php راه اندازی Routes و Controllerبرای ارسال و اعتبارسنجی توکن به چند route نیاز داریم.می‌توانید آن‌ها را در فایل web یا api اضافه کنید. بستگی به این دارد که بخواهید از OTP به عنوان Full Stack یا API Back-End استفاده کنید. این به شما بستگی دارد. در این مقاله ترجیح می دهم از راه دوم استفاده کنم.فایل routes/api.php را باز کنید و این route ها را قرار دهید: https://gist.github.com/mohammad-fouladgar/ef375de0cbacad659e542b50c31f0f80#file-otp_routes-php و سپس یک کنترلر AuthController.php مانند کلاس زیر ایجاد کنید: https://gist.github.com/mohammad-fouladgar/a02af640d155acacea1f66b7d9ac62e1#file-otpauthcontroller-php متد validate کاربر احراز شده را برمیگرداند و شما میتوانید بر اساس سیستم خود عملیات login را پیاده سازی کنید.با فرض استفاده از Sanctum شما کدی شبیه زیر را خواهید داشت:$token = $user-&gt;createToken(&#39;your_device_name&#39;)-&gt;plainTextToken;&#xA;&#xA;return response()-&gt;json([&#xA;    &#39;message&#39; =&gt; &#39;Login has been successfully.&#39;,&#xA;    &#39;token&#39;   =&gt; $token,&#xA;    &#39;result&#39;  =&gt; UserResource::make($user),&#xA;])حالا می توانید route های زیر را call کنید:# send otp request&#xA;curl --request POST \&#xA;  --url http://localhost/api/send-otp \&#xA;  --data &#39;{&#xA; &#34;mobile&#34; : &#34;09130000000&#34;&#xA;}&#39;&#xA;&#xA;# validate otp request&#xA;curl --request POST \&#xA;  --url http://localhost/api/validate-otp \&#xA;  --data &#39;{&#xA; &#34;mobile&#34; : &#34;09130000000&#34;,&#xA; &#34;token&#34; : &#34;94352&#34;&#xA;}&#39;&#xA;ممنون از وقت با ارزشی که گذاشتید و این مقاله رو مطالعه کردید.امیدوارم که بتونید از این پکیج در پروژه های خود استفاده کنید.برای خوندن داکیومنت این پکیج به آدرس گیت هاب زیر مراجعه کنید: https://github.com/mohammad-fouladgar/laravel-otp </description><category>fouladgar.dev</category><author>fouladgar.dev</author><pubDate>Fri, 11 Nov 2022 15:10:37 +0330</pubDate></item><item><title>Laravel Mobile Verification</title><link>https://virgool.ir/Software/laravel-mobile-verification-c5tgkofctifx</link><description>Laravel Mobile Verificationاکثر برنامه های تحت وب کاربران خود را ملزم میکنند که شماره موبایل خود را  قبل از استفاده از خدمات وب سایت تایید کنند. بجای اینکه شما مجبور باشید برای هر وب اپلیکیشن یا وب سایت خود این عملیات را پیاده سازی کنید، پکیج Laravel Mobile Verification امکاناتی مانند Verify, Send و Resend کردن کد تاییدی موبایل کاربران را به شما می دهد.پیاده سازیدر ابتدا، مطمئن شوید که مدل User شما از اینترفیس  MustVerifyMobile  به صورت زیر پیاده سازی شده باشد: https://gist.github.com/mohammad-fouladgar/c4833dca6859bf2b16349ba7b2989707 سپس باید سرویسی که میخواهید از آن برای ارسال SMS استفاده کنید را مشخص کنید مانند (sms.ir,kavenegar.com و غیره...). برای ارسال SMS notification با این پکیج شما باید از اینترفیس SMSClient یک نمونه پیاده سازی کنید. این اینترفیس ملزم میکند که شما یک متد به اسم      sendMessage را پیاده سازی کنید و این متد نتیجه ارسال SMS را از طریق آبجکت Payload که شامل شماره موبایل و توکن کاربر است را بر میگرداند:  https://gist.github.com/mohammad-fouladgar/8a968e72e502fe63df8ff3b108a67e1f برای تنظیم کردن و معرفی کردن SMS client  پیاده سازی شده شما باید فایل کانفیگ mobile_verifier.php را پابلیش کنید:php artisan vendor:publish --provider=&#34;Fouladgar\MobileVerification\ServiceProvider&#34; --tag=&#34;config&#34;و کلاس را در فایل کانفیگ معرفی کنید: https://virgool.io/p/c5tgkofctifx/gist.github.com/mohammad-fouladgar/aec20546fa81e33707ffc9a7908de415 روش استفادهدر ایجا میتوانید مشاهده کنید چگونه بعد از ثبت نام کابر میتوانید token را ارسال کنید: https://gist.github.com/mohammad-fouladgar/03f92366c1bbeba6570202f180915ac7 تایید کردنشما باید برای کاربری که لاگین شده از طریق Route زیر Token را ارسال کنید:/auth/mobile/verifycurl -X POST \&#xA;      http://example.com/auth/mobile/verify \&#xA;      -H &#39;Accept: application/json&#39; \&#xA;      -H &#39;Authorization: YOUR_JWT_TOKEN&#39; \&#xA;      -F token=YOUR_VERIFICATION_TOKENارسال مجدداگر شما نیاز دارید برای کاربر دوباره Token ارسال کنید میتوانید از لینک Route زیر استفاده کنید:/auth/mobile/resendcurl -X POST \&#xA;      http://example.com/auth/mobile/resend \&#xA;      -H &#39;Accept: application/json&#39; \&#xA;      -H &#39;Authorization: YOUR_JWT_TOKEN&#39;برای اطلاعات بیشتر از امکانات پیکیج به مخزن و داکیومنت GitHub مراجعه کنید: https://github.com/mohammad-fouladgar/laravel-mobile-verification </description><category>fouladgar.dev</category><author>fouladgar.dev</author><pubDate>Tue, 16 Feb 2021 13:03:29 +0330</pubDate></item><item><title>Laravel Eloquent Filter (All in one)</title><link>https://virgool.ir/@fouladgar.dev/laravel-eloquent-filter-all-in-one-ziycesiv5iz5</link><description>تا حالا شده در پروژهای خود با پارامترهای زیادی برای ارسال به API روبرو شده باشید؟ و شما باید براساس آنها تعداد زیادی کوئری های پیچیده ای ایجاد کنید؟! پس اگر جواب شما مثبت هستش این مقاله را تا آخر دنبال کنید.در ابتدا اگر شما قبلا مقاله ساخت جستجوی پیشرفته در لاراول را نخوانده اید به شما توصیه میکنم حتما آن را مطالعه کنید. در مقاله ذکر شده شما یاد میگیرید که چگونه برای مدل های Eloquent فیلترهای پیشرفته بسازید. همچنین ممکن است شما به فیلترهای Secure نیاز داشته باشید. فیلترهای Secure مجوز لازم قبل از اعمال فیلتر برای کاربر را بررسی میکند که میتوانید مقاله مربوط به آن را در اینجا مطالعه کنید.و حالا،  اگر شما نخواهید ساختار پیش فرض لاراول را دنبال کنید راهکار برای ساخت فیلتر چیست؟تعریف فیلتر برای هر Module/Domainدر یک پروژه کوچک شما میتوانید از معماری پیش فرض لاراول (MVC) استفاده کنید که ساختار دایرکتوری ها بصورت زیر می باشد:.&#xA;├── app&#xA;│   ├── Console&#xA;├── EloquentFilters // Default directory for filters&#xA;│   └── Product&#xA;│       ├── PriceMoreThanFilter.php&#xA;│   └── User&#xA;│       ├── AgeMoreThanFilter.php&#xA;│       └── GenderFilter.php&#xA;└── Exceptions&#xA;│   ├── Http&#xA;│   │   ├── Controllers&#xA;│   │   ├── Middleware&#xA;│   │   └── Requests&#xA;│   └── Providers&#xA;├── bootstrap&#xA;├── config&#xA;├── database&#xA;├── public&#xA;├── resources&#xA;├── routes&#xA;├── storageکه شما میتوانید از EloquentBuilder  به صورت زیر استفاده کنید: https://gist.github.com/mohammad-fouladgar/9e3472684bbe5e4d0e365195cd9fb0a7 اما زمانی که پروژه شما به مرور زمان بزرگ می شود، ساختار پیش فرض کافی نیست! درنهایت، شما مجبورید از معماری های متفاوتی (مانند Domain-Driven-Desgin, HMVC, …) استفاده کنید یا ساختار فعلی را تغییر دهید. به ساختار زیر توجه کنید:.&#xA;├── app&#xA;├── bootstrap&#xA;├── config&#xA;├── database&#xA;├── Domains&#xA;│   ├── Product&#xA;│   │   ├── database&#xA;│   │   │   └── migrations&#xA;│   │   ├── src&#xA;│   │       ├── Filters //Custom directory for Product model filters&#xA;│   │       │   └── PriceMoreThanFilter.php&#xA;│   │       ├── Entities&#xA;│   │       ├── Http&#xA;│   │          └── Controllers&#xA;│   │       ├── routes&#xA;│   │       └── Services&#xA;│   ├── User&#xA;│   │   ├── database&#xA;│   │   │   └── migrations&#xA;│   │   ├── src&#xA;│   │       ├── Filters //Custom directory for User model filters&#xA;│   │       │   └── AgeMoreThanFilter.php&#xA;│   │       ├── Entities&#xA;│   │       ├── Http&#xA;│   │          └── Controllers&#xA;│   │       ├── routes&#xA;│   │       └── Services&#xA;...در این اینجا از ساختار پیش فرض دایرکتوری لاراول استفاده نشده است.این هفته، ورژن جدید EloquentBuilder منتشر شد. در این ورژن یک متد جدید بنام    setFilterNamespace اضافه شد که به شما این قابلیت را می دهد که برای ”هر دامنه یا ماژول“ بصورت جداگانه filter namespace را تنظیم کنید.حالا شما میتوانید بصورت زیر برای هر مدل از فیلترها استفاده کنید: https://gist.github.com/mohammad-fouladgar/23024b97f30b5cd053c2014262b71553 جمع بندیکار با پارامترهای ورودی API خسته کننده و پیچیده است. بنابراین استفاده از این پکیج میتواند شما را از این نوع پیچیدگی ها دور کند تا با خیال راحت خصوصا در پروژه هایی با ابعاد بزرگ بر روی منطق اصلی تمرکز کنید.  https://github.com/mohammad-fouladgar/eloquent-builder </description><category>fouladgar.dev</category><author>fouladgar.dev</author><pubDate>Tue, 07 Jan 2020 11:02:28 +0330</pubDate></item><item><title>ساخت فیلتر برای Eloquent Models با بررسی مجوز فیلتر</title><link>https://virgool.ir/@fouladgar.dev/ساخت-فیلتر-برای-eloquent-models-با-بررسی-مجوز-فیلتر-jjmyzplzkyxz</link><description>Photo by James Sutton on Unsplashدر پستی قبلی پکیجی را معرفی کردم که برای شما این امکان را فراهم می کرد که برای مدل های خود در لاراول فیلتر ایجاد کنید. مشاهده پست در اینجا.آخرین نسخه منشتر شده از این پکیج در مخزن گیت هاب قابل دسترس می باشد: V1.0.0همانطور که قبلا توضیح دادم شما در یک پروژه نیاز به فیلتر کردن یک مدل مانند User دارید. مثلا فیلتر کردن کاربران بر اساس سن،جنسیت، وضعیت آنلاین یا آفلاین بودن و غیره... .ممکن است شما بخواهید یک فیلتر با مجوز خاصی اعمال شود.بعنوان مثال شما ممکن است تعیین کنید اگر یک کاربر مدیر است یا دارای یک حساب ممتاز می باشد می تواند فیلتر وضعیت آنلاین یا آفلاین بودن کاربران را اعمال کند.در ادامه برای درک بهتر یک مثال عملی را انجام خواهیم داد.راه اندازی فریم ورک لاراول و پکیج EloquentBuilderدر ابتدا اگر لاراول را نصب نکرده اید، دستور زیرا برای نصب اجرا کنید:$ composer create-project --prefer-dist laravel/laravel authorize-filterبعد از نصب وارد پروژه شوید و پکیج EloquentBuilder را با دستور زیر نصب کنید:$ composer require mohammad-fouladgar/eloquent-builderحالا باید در پوشه app پوشه جدیدی بنام EloquentFilters ایجاد کنید. این پوشه محل ذخیره سازی فیلتر مدل ها می باشد.ساخت Route و Controllerدر این مرحله، ما نیاز داریم به ساخت یک Route برای لیست و فیلتر کردن کاربران. بنابراین فایل routes/web.php را باز کنید و route زیر را اضافه کنید:routes/web.phpRoute::get(&#39;users&#39;, &#39;UserController@index&#39;);سپس باید یک کنترلر به اسم UserController به صورت زیر ایجاد کنیم: https://gist.github.com/mohammad-fouladgar/32a49b4ff9c287511a6128be86be86f9 حالا شما میتوانید url زیر را در مرورگر خود باز کنید:http://localhost:8000/usersبا اجرای این url  لیست کاربران بدون محدودیت برمی گردد.در مرحله بعد دو فیلتر جنسیت و وضعیت را پیاده سازی خواهیم کرد.فیلتر جنسیت (GenderFilter)در این قسمت میخواهیم کاربران را براساس جنسیت فیلتر کنیم.ابتدا باید یک پوشه جدید بنام User در پوشه EloquentFilters ایجاد کنیم.این پوشه شامل فیلترهای مدل User می باشد.سپس یک فایل جدید بنام GenderFilter.php  بصورت زیر بسازید:app/EloquentFilters/User/GenderFilter.php https://gist.github.com/mohammad-fouladgar/2850e3a62d20d92b0c486f3be43d64f1 بعد از ساخت فیلتر بالا،شما میتوانید آنرا بصورت زیر روی کوئری خود اعمال کنید:http://localhost:8000/users?filter[gender]=maleبا اجرای این url فقط لیست کاربرانی برمی گردد که جنسیت آنها male است.فیلتر وضعیت (StatusFilter)این فیلتر مشابه فیلتر جنسیت می باشد با این تفاوت که این فیلتر به کاربری که دارای حساب ممتاز باشد مجوز اعمال فیلتر بر روی کوئری را می دهد. به فیلتر زیر نگاهی داشته باشید:app/EloquentFilters/User/StatusFilter.php https://gist.github.com/mohammad-fouladgar/0744491c081fa1b601d1478b0b66d25a همانطور که مشاهده میکنید، این فیلتر یک متد بنام &#39;authorize&#39; دارد. درون این متد میتوانید بررسی کنید که کاربر مجوز اعمال فیلتر داده شده را دارد یا خیر.برای اعمال فیلتر بالا url زیر را در مرورگر خود باز کنید:http://localhost:8000/users?filter[gender]=male&amp;filter[status]=onlineاین url لیست کاربرانی که جنسیت male دارند و وضعیت آنها online می باشد را بر میگرداند.این در صورتی است که متد authorize مقدار true را برگرداند یا در کلاس فیلتر پیاده سازی نشود.(مانند فیلتر جنسیت)برای دیدن جزیئات بیشتر اینجا کلیک کنید.جمع بندیدر این مقاله نحوه استفاده از پکیج EloquentBuilder را در فریم ورک لاراول را یاد گرفتیم.همچنین یاد گرفتیم:چگونگی ساخت فیلتر برای یک مدلچگونگی اعمال فیلترها بر روی کوئریچگونگی چک کردن مجوز، قبل از اعمال فیلتر داده شدهو در نهایت داشتن یک کد تمیز،خوانا و قابل توسعه.امیدوارم که این آموزش مورد توجه شما قرار گرفته باشه. خوشحال میشم نظرات شما را داشته باشم.موفق باشید.</description><category>fouladgar.dev</category><author>fouladgar.dev</author><pubDate>Sat, 20 Jul 2019 23:53:09 +0430</pubDate></item><item><title>ساخت فیلترهای جستجوی پیشرفته در لاراول</title><link>https://virgool.ir/Software/نوشتن-فیلترهای-جستجوی-پیشرفته-در-لاراول-bcnyjvxu3ygj</link><description>در پروژه اخیر ما نیاز به یک جستجوی پیشرفته روی مدل های مختلف داشتیم.این جستجو فیلترهای زیادی را شامل می شد که نیازمند یک سیستم جستجوی منعطف و مقیاس پذیر بود.من تصمیم گرفتم برای این سیستم یک پکیج پیاده سازی کنم که شما می توانید آن را در گیت هاب مشاهده  و در پروژهای خود استفاده کنید.مشکل چیست؟مشکل از اینجا شروع می شود که شما با مجموعه ای از فیلترها روبرو می شوید که برای اضافه کردن آنها به Query باید شرط های زیادی را برسی کنید.نوشتن شرط های زیاد حتما از خوانایی کد شما می کاهد و روند توسعه را کُند و پیچیده می کند. همچنین, شما از فیلتر ها وشرط هایی که نوشتید فقط می توانید در یک حوزه استفاده کنید و قابل استفاده مجدد نیز نخواهند بود.راه حلشما باید کدهای خود را Refactor کنید !برای رهایی از این مشکل باید کد خود را به روش Polymorphism برای جایگزین کردن شرط ها Refactor کنید.برای آشنایی بیشتر این design pattern اینجا کلیک کنید.مثال عملیفرض کنید شما نیاز دارید لیست کاربرانی را با پارامترهای درخواستی زیر دریافت کنید:http://virgool.io/users?age_more_than=25&amp;gender=male&amp;has_published_post=trueپارامتر های درخواستی به صورت زیر خواهند بود:[&#xA;    &#39;age_more_than&#39;      =&gt; &#39;25&#39;,&#xA;    &#39;gender&#39;             =&gt; &#39;male&#39;,&#xA;    &#39;has_published_post&#39; =&gt; &#39;true&#39;,&#xA;]در روش معمولی ما بصورت زیر فیلتر ها را اعمال میکنیم: https://gist.github.com/mohammad-fouladgar/ddd1564fb4e979f61c34a68a2746245c دراینجا به ازای پارامتر های درخواستی, شرط هایی را برسی کردیم. با اضافه شدن پارامترهای درخواستی, ما باید شرط های دیگری را جهت برسی و محدود کردن Query به تیکه کد بالا اضافه کنیم که تمیزی کد ما را ا بین می برد.استفاده از پکیج Eloquent-Builder برای حل مشکلبعد از نصب پکیج معرفی شده, تنها کافیست کد خود را به صورت زیر تغییر دهید: https://gist.github.com/mohammad-fouladgar/4c37f0cc4a5e7df43f7335c35315412b شما فقط کافیست مدل و لیست پارامترها را به متد to ارسال کنید.و بعد از آن به ازای پارامترهای درخواستی که قرار است به Query اضافه شوند فیلتر تعریف کنیم.به همین راحتی!تعریف یک فیلتر:برای نمونه من یکی از فیلترهای مثال بالا را پیاده سازی میکنم.به مثال زیر دقت کنید: https://gist.github.com/mohammad-fouladgar/d9ea28c6e4088f450a1eef6b71b0f94c برای مشاهده جزئیات بیشتر به آدرس پکیج در گیت هاب مراجعه کنید.موفق باشید و ممنون بابت وقتی که گذاشتید.</description><category>fouladgar.dev</category><author>fouladgar.dev</author><pubDate>Sat, 25 Aug 2018 15:41:42 +0430</pubDate></item></channel></rss>