uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

| AmirHossein |

| AmirHossein |

Відкрити в Telegram

پنوشته‌های یک برنامه‌نویس ناشی 🫂 @StartBevy

Показати більше
610
Підписники
Немає даних24 години
+27 днів
+230 днів
Архів дописів
‏LaraGram 3 طوری طراحی شده که دولوپر به هر سبک و روشی که دوست داره و مورد نیازش هست کد هاشو بنویسه. به عنوان مثال فقط 6 روش ب
+1
‏LaraGram 3 طوری طراحی شده که دولوپر به هر سبک و روشی که دوست داره و مورد نیازش هست کد هاشو بنویسه. به عنوان مثال فقط 6 روش برای هندل آپدیت ها وجود داره که توی تصاویر هست. هیچ قابلیتی نیست که توی LaraGram پیدا نشه، فقط و فقط مشکل Async رو داریم که محدود به زبات PHP هست، البته با روش هایی مثل Fork کردن پروسس ها، استفاده از Swoole و AMPHP و ... می تونیم جلوی بلاک شدن ربات رو بگیریم، که LaraGram به طور پیشفرض پروسس هارو Fork میکنه. هر قابلیتی هم که نباشه میشه به عنوان پکیج و سرویس براش نوشت و روی اون سوار کرد. مورد دیگه بهینگی هست، LaraGram بیشتر از 15 یا حتی 20 مگابایت حجم داره، که روز به روز بیشتر میشه، ولی به واسطه کش ها و سرویس کانتینر، با یک فایل 100 کیلوبایتی برابری میکنه. هیچ سرویسی اضافی و بی دلیل لود نمیشه و سربار اضافی ایجاد نمیکنه. قابلیت های فراتر از نیاز توسعه ربات تلگرامی توی LaraGram وجود داره، عملا هر کاری با اون امکان پذیر هست. ولی همه این ها تا زمانی که شناخته نشه و مورد استفاده و استقبال قرار نگیره فایده نداره. - LaraGram - Laraquest - Core @AmirhDeveloper .

یکی دیگه از ویژگی‌های کاملا منطقی LaraGram ورژن 3، سیستم Template هست. مشابه موتور Blade برای Laravel هست، با این تفاوت که La
+1
یکی دیگه از ویژگی‌های کاملا منطقی LaraGram ورژن 3، سیستم Template هست. مشابه موتور Blade برای Laravel هست، با این تفاوت که Laravel برای وب به صورت HTML خروجی می‌گیره، ولی ما برای ارسال پیام توی Telegram خروجی میگیریم. چنین چیزی احتمالا کاربردی نداره، کار رو هم ساده نمی‌کنه؛ ولی از اونجایی که ۸۰ درصد لاراول رو بازنویسی کردم، گفتم Blade هم بنویسم که ساختار اون رو هم یاد بگیرم. - LaraGram - Laraquest - Core @AmirhDeveloper .

فصل شش - Requests and Response بخش اول - پردازش درخواست و پاسخ در این قسمت به متدهای Response خواهیم پرداخت. ریسپانس‌ها، پاسخی هستند ک از سوی کنترلرها برای کلاینت return می‌شوند.
class UserController extends Controller
{
 public function store(Request $request)
 {
  // ...

  return response("User Stored!");
 }
}
کد بالا یک نمونه از شیوه ارسال ریسپانس را نشان می‌دهد که یک متن پس از ذخیره کاربر، به سمت مرورگر کلاینت ارسال می شود. معمولا برای ارسال ریسپانس از هلپر فانکشن ها استفاده می شود. در ادامه با این هلپر ها آشنا می شویم. 1- متد response ایجاد یک پاسخ ساده.
return response('Hello, World!');
متن "Hello, World!" در مرورگر نمایش داده می‌شود. 2- متد header افزودن یک هدر (header) به پاسخ.
return response('OK')->header('X-Custom-Header', 'MyValue');
3- متد withHeaders افزودن چندین header به پاسخ.
return response('Headers Set')->withHeaders([
 'X-Header-One' => 'Value1',
 'X-Header-Two' => 'Value2',
]);
4- متد cookie اضافه کردن cookie به پاسخ.
return response('Cookie Set')->cookie('user', 'JohnDoe', 60);
5- متد withoutCookie حذف یک cookie از پاسخ.
return response('Cookie Removed')->withoutCookie('user');
6- متد view بازگرداندن یک view به عنوان پاسخ. (فایل های Blade)
return response()->view('welcome');
نمای welcome.blade.php نمایش داده می‌شود. 7- متد json بازگرداندن یک JSON به عنوان پاسخ.
return response()->json(['name' => 'John', 'age' => 30]);
8- متد withCallback اضافه کردن JSONP callback به پاسخ JSON.
return response()->json(['name' => 'John'])->withCallback('myCallback');

// Output:
// myCallback({"name":"John"});
9- متد download دانلود یک فایل از سرور.
return response()->download(storage_path('app/file.pdf'));
10- متد file نمایش یک فایل بدون دانلود.
return response()->file(storage_path('app/image.jpg'));
11- متد stream استریم داده‌ها (ارسال محتوا به صورت chunk-شده).
return response()->stream(function () {
    echo 'Streaming content...';
});
12- متد streamJson ارسال JSON به‌صورت استریم.
return response()->streamJson(['status' => 'processing']);
13- متد eventStream ارسال داده‌ها به‌صورت Server-Sent Events (SSE).
return response()->eventStream(function ($stream) {
    $stream->push(['message' => 'Hello, World!']);
});
14- متد streamDownload دانلود یک فایل به‌صورت stream.
return response()->streamDownload(function () {
    echo 'File content...';
}, 'myfile.txt');
15- متد redirect تغییر مسیر (redirect) به یک URL.
return redirect('/home');
16- متد route تغییر مسیر (redirect) به یک route.
return redirect()->route('dashboard');
17- متد action تغییر مسیر (redirect) به یک controller action.
return redirect()->action([HomeController::class, 'index']);
18- متد away تغییر مسیر (redirect) به یک URL خارجی.
return redirect()->away('https://google.com');
19- متد with ارسال داده‌های session همراه با redirect.
return redirect()->route('home')->with('message', 'Welcome back!');
یک message در session ذخیره می‌شود و پس از redirect قابل دسترسی است. 20- متد back بازگشت به صفحه‌ی قبلی.
return redirect()->back();
21- متد withInput ارسال داده‌های form input در session هنگام redirect.
return redirect()->back()->withInput();
#laravel #لاراول #فصل_۶ @AmirhDeveloper .

فصل شش - Requests and Response بخش اول - پردازش درخواست و پاسخ در این قسمت به سایر متدهای در دسترس از کلاس Request می پردازیم. 1- متد cookie مقدار یک کوکی را برمی‌گرداند.
$value = $request->cookie('user_token');
2- متد all تمام داده‌های ورودی (query parameters، POST data، JSON payloads) را به‌صورت آرایه برمی‌گرداند.
$data = $request->all();
3- متد collect داده‌های ورودی را به‌عنوان Collection لاراول برمی‌گرداند. کالکشن‌ها در لاراول مجموعه‌ای از داده‌ها هستند که امکانات پیشرفته‌ای برای کار با آرایه‌ها ارائه می‌دهند. در فصل های مربوطه به کار با کالکشن ها خواهیم پرداخت.
$collection = $request->collect();
4- متد input مقدار یک ورودی خاص را دریافت می‌کند.
$name = $request->input('name');
همچنین می توان input مورد نظر را به صورت پراپرتی دریافت کرد:
$name = $request->name;
5- متد query مقدار یک متغیر در query string را دریافت می‌کند.
$sort = $request->query('sort', 'asc');
پارامتر اول کلید کوئری و پارامتر دوم مقدار پیشفرض می باشد. 6- متد string مقدار یک ورودی را به‌عنوان Stringable لاراول برمی‌گرداند. در لاراول Stringable همانند کالکشن که برای کار با آرایه ها است، برای کار با رشته ها می باشد.
$name = $request->string('name');
این متد input با نام name را در قالب شئ از Stringable باز می گرداند و می توان متد های زیادی را بر روی آن فراخوانی کرد:
$name = $request->string('name')->upper();
7- متد integer مقدار ورودی را به عدد صحیح (integer) تبدیل می‌کند.
$age = $request->integer('age');
8- متد boolean مقدار ورودی را به مقدار بولی (true یا false) تبدیل می‌کند.
$active = $request->boolean('active');
9- متد date مقدار ورودی را به شیء Carbon تبدیل می‌کند. کربن نیز یک کلاس برای کار با زمان ها می باشد.
$birthday = $request->date('birthday');
10- متد enum مقدار ورودی را با یک enum مقایسه می‌کند.
$status = $request->enum('status', OrderStatus::class);
11- متد enums چند مقدار ورودی را با یک enum بررسی می‌کند.
$statuses = $request->enums('statuses', OrderStatus::class);
12- متد has بررسی می‌کند که آیا مقدار مشخصی در درخواست وجود دارد یا نه.
if ($request->has('name')) {
}
13- متد hasAny بررسی می‌کند که آیا حداقل یکی از مقادیر مشخص‌شده در درخواست وجود دارد یا نه.
if ($request->hasAny(['name', 'email'])) {
}
14- متد whenHas اگر مقدار مشخص‌شده در درخواست وجود داشته باشد، یک تابع را اجرا می‌کند.
$request->whenHas('name', function ($name) {
});
15- متد isNotFilled بررسی می‌کند که مقدار ورودی وجود نداشته باشد یا خالی باشد.
if ($request->isNotFilled('email')) {
}
16- متد filled بررسی می‌کند که مقدار مشخص‌شده در درخواست پر شده باشد.
if ($request->filled('email')) {
}
17- متد anyFilled بررسی می‌کند که حداقل یکی از مقادیر مشخص‌شده در درخواست پر شده باشد.
if ($request->anyFilled(['email', 'phone'])) {
}
18- متد whenFilled اگر مقدار مشخص‌شده در درخواست پر شده باشد، یک تابع را اجرا می‌کند.
$request->whenFilled('email', function ($email) {
});
19- متد missing بررسی می‌کند که مقدار مشخص‌شده در درخواست وجود نداشته باشد.
if ($request->missing('email')) {
}
20- متد whenMissing اگر مقدار مشخص‌شده در درخواست وجود نداشته باشد، یک تابع را اجرا می‌کند.
$request->whenMissing('email', function () {
});
21- متد merge مقدار جدیدی به داده‌های درخواست اضافه می‌کند.
$request->merge(['role' => 'admin']);
22- متد mergeIfMissing مقدار جدیدی را فقط در صورتی که وجود نداشته باشد اضافه می‌کند.
$request->mergeIfMissing(['role' => 'user']);
23- متد file یک فایل آپلودی را در قالب شئ از فایل دریافت می‌کند و می توان عملیات های مختلف مانند ذخیره سازی بر روی آن اجرا کرد.
$file = $request->file('avatar');
24- متد hasFile بررسی می‌کند که آیا فایلی آپلود شده است یا نه.
if ($request->hasFile('avatar')) {
}
25- متد old مقدار یک ورودی را از session دریافت می‌کند. (معمولا درخواست قبلی)
$oldValue = $request->old('name');
تا اینجا با تمامی متد های قابل فراخوانی از کلاس Request آشنا شده ایم، در قسمت بعدی به متد های Response خواهیم پرداخت. #laravel #لاراول #فصل_۶ @AmirhDeveloper .

فصل شش - Requests and Response بخش اول - پردازش درخواست و پاسخ لاراول برای مدیریت درخواست‌ها از کلاس Illuminate\Http\Request استفاده می‌کند که قابلیت‌های زیادی برای دسترسی و فیلتر کردن داده‌های ورودی دارد. این کلاس معمولا در Controller ها یا Route-Closure ها استفاده می شود:
class UserController extends Controller
{
 public function store(Request $request)
 {
  $request->...
 }
}

// OR

Route::get('/', function(Request $request) {
 $request->...
});
در ادامه با متد های در دسترس از این کلاس آشنا می شویم. 1- متد path این متد مسیر درخواست شده را بدون دامنه برمی‌گرداند.
$request->path(); // posts/10
2- متد is بررسی می‌کند که مسیر درخواست با یک الگو مطابقت دارد یا نه.
if ($request->is('posts/*')) {
}
3- متد routeIs بررسی می‌کند که مسیر درخواست با نام روت خاصی مطابقت دارد یا نه.
if ($request->routeIs('post.show')) {
}
4- متد url آدرس کامل بدون query string را برمی‌گرداند.
$request->url(); // http://example.com/posts/10
5- متد fullUrl آدرس کامل شامل query string را برمی‌گرداند.
$request->fullUrl();
// http://example.com/posts/10?sort=desc
6- متد fullUrlWithQuery یک پارامتر کوئری را به URL اضافه می‌کند.
$request->fullUrlWithQuery(['page' => 2]); 
// http://example.com/posts?sort=desc&page=2
7- متد fullUrlWithoutQuery برخی از پارامترهای کوئری را از URL حذف می‌کند.
$request->fullUrlWithoutQuery(['sort']);
// http://example.com/posts?page=2
8- متد host دامنه درخواست را برمی‌گرداند.
$request->host(); // example.com
9- متد httpHost دامنه همراه با پورت را برمی‌گرداند.
$request->httpHost(); // example.com:8080
10- متد schemeAndHttpHost پروتکل (http یا https) و دامنه را برمی‌گرداند.
$request->schemeAndHttpHost();
// https://example.com
11- متد ip آدرس IP درخواست‌دهنده را برمی‌گرداند.
$request->ip(); // 192.168.1.1
12- متد ips لیست IPهای درخواست‌دهنده را برمی‌گرداند.
$request->ips();
// [192.168.1.1, 10.0.0.2]
13- متد method متد HTTP درخواست (GET, POST, PUT, DELETE) را برمی‌گرداند.
$request->method(); // POST
14- متد isMethod بررسی می‌کند که متد HTTP درخواست مقدار خاصی دارد یا نه.
if ($request->isMethod('post')) {
}
15- متد header مقدار یک هدر خاص را برمی‌گرداند.
$request->header('User-Agent'); // "Mozilla/5.0"
16- متد hasHeader بررسی می‌کند که آیا یک هدر مشخص در درخواست وجود دارد یا نه.
if ($request->hasHeader('Authorization')) {
}
17- متد bearerToken مقدار Bearer Token در هدر Authorization را برمی‌گرداند.
$request->bearerToken();
18- متد getAcceptableContentTypes لیستی از انواع محتوای مورد قبول در هدر Accept را برمی‌گرداند.
$request->getAcceptableContentTypes();
// ['application/json', 'text/html']
19- متد accepts بررسی می‌کند که آیا نوع محتوای مشخص‌شده پذیرفته شده است یا نه.
if ($request->accepts('application/json')) {
}
20- متد prefers نوع محتوای ترجیحی را برمی‌گرداند.
$request->prefers(['text/html', 'application/json']);
21- متد expectsJson بررسی می‌کند که آیا درخواست انتظار JSON دارد یا نه.
if ($request->expectsJson()) {
}
22- متد flash داده‌ها را برای درخواست بعدی در سشن ذخیره می‌کند.
$request->flash();
23- متد flashOnly برخی از داده‌ها را در سشن ذخیره می‌کند.
$request->flashOnly(['name', 'email']);
24- متد flashExcept تمام داده‌ها به‌جز موارد مشخص‌شده را در سشن ذخیره می‌کند.
$request->flashExcept(['password']);
25- متد only فقط مقادیر مشخص‌شده را از درخواست دریافت می‌کند.
$request->only(['name', 'email']);
26- متد except تمام مقادیر درخواست به‌جز موارد مشخص‌شده را دریافت می‌کند.
$request->except(['password']);
سایر متد ها در پست بعدی توضیح داده می‌شود. #laravel #لاراول #فصل_۶ @AmirhDeveloper .

فصل پنج - Requests and Response بخش اول - پردازش درخواست و پاسخ در فریمورک لاراول، مفاهیم Request (درخواست) و Response (پاسخ) جزو مهم‌ترین اجزای پردازش درخواست‌های وب محسوب می‌شوند. این دو مفهوم در الگوی MVC بخش ارتباط بین کاربر (Client) و سرور (Backend) را مدیریت می‌کنند. 1- درخواست (Request) ‏Request در لاراول به تمام داده‌هایی گفته می‌شود که از طرف کاربر (مثلاً مرورگر، Postman یا یک کلاینت دیگر) به سرور ارسال می‌شود. این داده‌ها می‌توانند شامل موارد زیر باشند: - داده‌های فرم (POST) - پارامترهای URL (GET) - هدرهای HTTP - کوکی‌ها - فایل‌های آپلود شده - اطلاعات احراز هویت لاراول برای مدیریت درخواست‌ها از کلاس Illuminate\Http\Request استفاده می‌کند که قابلیت‌های زیادی برای دسترسی و فیلتر کردن داده‌های ورودی دارد. در کنترلرها، برای دریافت اطلاعات ورودی، می‌توان از کلاس Request استفاده کرد:
class UserController extends Controller
{
 public function store(Request $request)
 {
  $name = $request->input('name');

  $email = $request->input('email', 'default@example.com');

  $data = $request->all();

  $token = $request->header('Authorization');
 }
}
2- پاسخ (Response) ‏Response یا پاسخ، همان داده‌ای است که لاراول پس از پردازش درخواست به کلاینت ارسال می‌کند. این پاسخ می‌تواند شامل: ‏- HTML‏ یا View ‏- JSON‏ یا API Response - ریدارکت (Redirect) - دانلود فایل - ارسال پیام‌های خطا یا موفقیت باشد. در کنترلرها، برای ارسال پاسخ، می‌توان از فساد یا هلپر Response استفاده کرد:
class UserController extends Controller
{
 public function store(Request $request)
 {
  return response('Hello, Laravel!');

  return response()->json([
    'message' => 'Success',
    'status' => 200
  ]);

  return response()->view('welcome', ['name' => 'John']);
 }
}
در ادامه این بخش به بررسی Request و Response و تمامی متد های در دسترس از آنها خواهیم پرداخت. #laravel #لاراول #فصل_۶ @AmirhDeveloper .

یادم رفت

از فردا فصل 6 رو شروع می‌کنیم.

توی لاراول 12 با زدن کامند: composer run dev می‌تونیم لاراول رو اجرا کنیم. این روش به طور خودکار کامندهای: php artisan serve
+1
توی لاراول 12 با زدن کامند:
composer run dev
می‌تونیم لاراول رو اجرا کنیم. این روش به طور خودکار کامندهای:
php artisan serve
php artisan queue:listen --tries=1
php artisan pail --timeout=0
npm run dev
..
رو اجرا می‌کنه. البته می‌تونیم توی لاراول های قدیمی تر هم با اضافه کردن script اون به فایل composer.json این قابلیت رو داشته باشیم. @AmirhDeveloper .

Laravel 11.42 ✅❤️ یه سری شورت‌کات برای تاریخ توی الکوئنت اضافه شده که باهم مرور میکنیم. همشون مشخصه چیکار میکنند ولی یه توضیح ریز هم خواهیم داشت. 1. wherePast ✳️ فیلدی که ورودی میدید رو با تاریخ امروز مقایسه میکنه در صورتی که گذشته باشه برمیگردونه. 2. whereToday ✳️ اگر فیلیدی که ورودی میدید با تاریخ امروز یکسان باشه برمیگردونه. 3. whereFuture ✳️ فیلدی که وروردی میدید رو با تاریخ امروز مقایسه میکنه در صورتی که آینده باشه برمیگردونه. 4. whereNowOrFuture ✳️ فیلدی که وروردی میدید رو با تاریخ امروز مقایسه میکنه در صورتی که آینده باشه یا با تاریخ امروز یکسان باشه برمیگردونه. 5. whereNowOrPast ✳️ فیلدی که وروردی میدید رو با تاریخ امروز مقایسه میکنه در صورتی که گذشته باشه یا با تاریخ امروز یکسان باشه برمیگردونه. و چندتا تغییر دیگه که میتونید خودتون مطالعه کنید.

7 ماهی از انتشار ورژن 2 گذشته و ورژن 3 درحال توسعه هست. توی ورژن 3 تغییرات زیادی مخصوصا در پرفورمنس اعمال شده؛ سیستم های کش اکثر بخش های فریم‌ورک رو در بر گرفتن. همچنین Eloquent ORM به صورت کاملا اختصاصی بازنویسی شده. دلیل این بازنویسی این هست که، این ORM برای اجرا نیاز به کانتینر، ایونت‌ها، کیوها، و کلی چیز دیگه از لاراول داره. ما همه این سیستم هارو توی LaraGram داریم، ولی الوکوئنت دقیقا برای لاراول رو نیاز داره، به همین دلیل در کنار کانتینر LaraGram باید کانتینر Laravel هم لود بشه که منطقی نیست. اما‌ این بازنویسی تمامی وابستگی های خارجی رو حذف کرده و سرعت دوبرابر بهتر شده. از طرفی دو کرنل HTTP و Console اضافه شدن؛ کامند ها و درخواست ها به طور دقیق بررسی میشن، Gateها و Middlewareها روی اون ها اعمال میشن و خطاها به طور دقیق مدیریت میشن. سیستم چندزبانی اصافه شده. قابلیت مدیریت اتصال و توسعه چند ربات همزمان اضافه میشه. سیستمی تحت عنوان کامپوننت قراره اضافه بشه، که راستش خودم نمیدونم چی هست فقط میدونم قراره قابلیت باز استفاده از ماژول ها یا هرچیزی رو با فراخوانی یک تابع بده. مثلا شما نیاز نیست سیستم عضویت اجباری توسعه بدید، کافیه کامپوننت اون رو لود کنید. سیستم کیو و جاب اضافه میشه که می‌تونید به سادگی عملیات های زمان بندی شده رو توسعه بدید. قابلیت های جزئی هم طی توسعه اضافه میشن. و در نهایت احتمال اضافه شدن پروتکل MTProto در ورژن 3 هست؛ توسعه ش یکم سخت و زمانبر هست، برای همین قول نمیدم توی ورژن 3 بیاد، شاید توی ورژن 4 اضافه بشه، ولی میشه یک روز. و احتمالا چیزای دیگه که در آینده به ذهنم برسه. اگر ایده یا پیشنهادی دارید خوشحال میشم درمیون بذارید، یا توی توسعه کمک کنید. و اگر هم به پروژه استار بدید که خیلی بیشتر خوشحال میشم❤️ - LaraGram - Laraquest - Core @AmirhDeveloper .

🔰 در این سوال نکات زیادی حائز اهمیت است که معمولا در نظر گرفته نمی‌شود. 🔍 در ادامه، ساختار حلقه را به‌طور مفصل بررسی می‌کنیم:
for ($i = 10; $i--; $i > 0) {
    echo "$i ";
}
خروجی این حلقه به‌صورت زیر خواهد بود: 9 8 7 6 5 4 3 2 1 0 ⁉️ اما چرا؟ بیایید ساختار حلقه را از ابتدا بررسی کنیم. 🔰 ساختار کلی حلقه for حلقه for از سه بخش تشکیل شده است: 1- شروع: مقداردهی اولیه متغیر حلقه. این بخش تنها یک بار در ابتدای حلقه اجرا می‌شود. 2- شرط ادامه: تعیین می‌کند که آیا حلقه ادامه یابد یا متوقف شود. این بخش در هر تکرار، قبل از اجرای بدنه اجرا شده و شرط اجرای بدنه را بررسی می‌کند. 3- تغییر مقدار: مقدار متغیر حلقه را تغییر می‌دهد. این بخش پس از اجرای بدنه حلقه اجرا می‌شود. 🔰 بررسی اجرای حلقه ذکر شده 1- مقداردهی اولیه: - ابتدا متغیر $i مقدار 10 می‌گیرد و اجرای این بخش پایان می‌یابد. 2- بررسی شرط ($i--) در این قسمت نکات مهمی وجود دارد: - هر عدد به جز 0 مقدار true دارد، بنابراین تا زمانی که $i به 0 نرسد، حلقه ادامه خواهد داشت. - در عبارت $i-- از عملیات post-decrement استفاده شده است، یعنی ابتدا مقدار فعلی $i برای بررسی شرط استفاده می‌شود، سپس مقدار $i کاهش می‌یابد. - - به همین دلیل عدد 0 نیز چاپ خواهد شد. - - مقدار $i بعد از کاهش وارد بدنه حلقه می‌شود، بنابراین چاپ اعداد از 9 شروع می‌شود. اگر حلقه به این صورت نوشته می‌شد:
for ($i = 10; --$i; $i > 0) {
    echo "$i ";
}
در این حالت، ابتدا مقدار $i کاهش می‌یابد و سپس شرط بررسی می‌شود زیرا از عملیات pre-decrement، بنابراین 0 چاپ نمی‌شود و خروجی به این شکل خواهد بود: 9 8 7 6 5 4 3 2 1 3- بررسی قسمت سوم (تغییر مقدار update) - بخش سوم این حلقه روی مقدار $i تغییری ایجاد نمی‌کند، بنابراین عملاً بی‌اثر است و می‌توان حلقه را ساده‌تر نوشت:
for ($i = 10; $i--;) {
    echo "$i ";
}
🔰 مرور روند اجرای حلقه ذکر شده - مقدار دهی اولیه i با 10 - بررسی 10 == true، کاهش 10 به 9، چاپ 9 - بررسی 9 == true، کاهش 9 به 8، چاپ 8 ‏. ‏. ‏. - بررسی 2 == true، کاهش 2 به 1، چاپ 1 - بررسی 1 == true، کاهش 1 به 0، چاپ 0 - بررسی 0 == true، پایان حلقه ❗️ درک درست post-decrement ($i--) و pre-decrement (--$i) در حلقه‌ها اهمیت زیادی دارد و تفاوت‌های ظریفی در خروجی ایجاد می‌کند. 🔖 #PHP, #پی_اچ_پی, #چالش 👤 AmirHossein 💎 Channel: @DevelopixPHP

❓ خروجی حلقه کدام است؟ 1️⃣ Error 2️⃣ 10 9 8 7 6 5 4 3 2 1 3️⃣ Warning 4️⃣ 9 8 7 6 5 4 3 2 1 0 ✅ پاسخ خود را همراه با توضیح ار
❓ خروجی حلقه کدام است؟ 1️⃣ Error 2️⃣ 10 9 8 7 6 5 4 3 2 1 3️⃣ Warning 4️⃣ 9 8 7 6 5 4 3 2 1 0 ✅ پاسخ خود را همراه با توضیح ارائه دهید. ❗ بدون اجرای کد یا استفاده از هوش مصنوعی، کمی فکر کنید. 🔖 #PHP, #پی_اچ_پی, #چالش 👤 AmirHossein 💎 Channel: @DevelopixPHP

کامندهای Symfony که، توی Laravel هم استفاده شده و جدیدا توی LaraGram هم باز نویسی کردم، به قدری باهوش هستن که کافیه یک حرف از
کامندهای Symfony که، توی Laravel هم استفاده شده و جدیدا توی LaraGram هم باز نویسی کردم، به قدری باهوش هستن که کافیه یک حرف از کامند رو بنویسی تا متوجه بشه. اگر کامند هایی مثل m:c, ma:c, make:c, m:class یا هرچیز شبیه ش رو بزنید باز هم make:class رو متوجه میشه. @Amirhdeveloper

ایشالا تا سال دیگه ریلیز میشه (سال میلادی منظورمه🥰) ⭐️ LaraGram .
ایشالا تا سال دیگه ریلیز میشه (سال میلادی منظورمه🥰) ⭐️ LaraGram .

فصل پنج - Migrations and Database بخش چهارم - اتصالات دیتابیس در لاراول، مدیریت چندین اتصال به دیتابیس و استفاده از دیتابیس‌های مختلف به صورت ساده‌ای امکان‌پذیر است. - چندین اتصال به دیتابیس برای مدیریت چندین اتصال به دیتابیس فایل تنظیمات config/database.php را باز کنید. در آرایه‌ی connections، می‌توانید چندین کانکشن مختلف تعریف کنید. مثال:
'connections' => [
  'mysql' => [
    // ...
  ],
  'mysql_second' => [
    // ...
  ],
]
در اینجا دو کانکشن مختلف با نام های mysql و mysql_second را پیکربندی می کنیم. —————— - استفاده از چندین کانکشن در کد پس از تعریف کانکشن‌ها در فایل تنظیمات، می‌توانید به صورت زیر از آن‌ها استفاده کنید:
// connect to 'mysql'
$data = DB::connection('mysql')->select('SELECT * FROM users');

// connect to 'mysql_second'
$data = DB::connection('mysql_second')->select('SELECT * FROM products');

// In migrations
public function up()
{
  Schema::connection('mysql_second')->create('products', function (Blueprint $table) {
     // ...
  });
}
همچنین در یک مدل خاص می‌توانید کانکشن را مشخص کنید:
class Product extends Model
{
  protected $connection = 'mysql_second';
}
—————— - استفاده از MongoDB برای استفاده از MongoDB در لاراول، می‌توانید از پکیج رسمی mongodb/laravel-mongodb استفاده کنید. این پکیج توسط MongoDB نگهداری می‌شود و ادغام کاملی با Eloquent و سایر ویژگی‌های لاراول فراهم می‌کند. در ادامه، مراحل نصب و پیکربندی این پکیج را توضیح می‌دهم: با استفاده از Composer، پکیج را به پروژه خود اضافه کنید:
composer require mongodb/laravel-mongodb
پس از نصب پکیج، باید تنظیمات مربوط به اتصال به دیتابیس MongoDB را در فایل config/database.php اضافه کنید. در بخش connections، کانکشن mongodb را به صورت زیر تعریف کنید:
'connections' => [
    // others...

    'mongodb' => [
        'driver' => 'mongodb',
        'dsn' => env('MONGODB_URI', 'mongodb://localhost:27017'),
        'database' => env('MONGODB_DATABASE', 'laravel_app'),
    ],
],
پس از آن با کانکشن mongodb به دیتابیس mongodb خود متصل شوید. —————— - استفاده از Redis در لاراول لاراول به صورت داخلی از Redis پشتیبانی می‌کند. تنظیمات Redis را می توانید در فایل config/database.php بررسی کنید. در این دوره استفاده از ردیس به طور کامل بررسی نمی شود، اما تمامی متد های ردیس از فساد Redis در دسترس هستند:
use Illuminate\Support\Facades\Redis;

Redis::set('key', 'value');

$value = Redis::get('key');
#laravel #لاراول #فصل_۵ @AmirhDeveloper .

فصل پنج - Migrations and Database بخش سوم - Seeders ‏Seeder یکی از ابزارهای لاراول است که برای وارد کردن داده‌های اولیه یا نمونه به پایگاه داده استفاده می‌شود. این ابزار به توسعه‌دهندگان کمک می‌کند تا داده‌های لازم برای تست یا مقداردهی اولیه پایگاه داده را به صورت خودکار و سریع ایجاد کنند. فرض کنید می‌خواهید جدول cities را با داده‌های اولیه شهرها پر کنید. این جدول ممکن است شامل نام شهرها و استان‌های آن‌ها باشد. 1- ایجاد Seeder ابتدا Seeder جدیدی برای جدول شهرها ایجاد می‌کنیم، این کار به وسیله دستور زیر انجام می شود:
php artisan make:seeder CitySeeder
2- پر کردن Seeder فایل database/seeders/CitySeeder.php را باز کرده و داده‌های اولیه را به صورت دستی وارد کنید:
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\City;

class CitySeeder extends Seeder
{
 public function run()
 {
  $cities = [
   ['name' => 'Tehran', 'province' => 'Tehran'],
   ['name' => 'Mashhad', 'province' => 'Khorasan Razavi'],
   ['name' => 'Isfahan', 'province' => 'Isfahan'],
   ['name' => 'Shiraz', 'province' => 'Fars'],
   ['name' => 'Tabriz', 'province' => 'East Azerbaijan'],
  ];

  foreach ($cities as $city) {
   City::create($city);
  }
  // Or using query builder:
  //City::insert($cities);
 }
}
3- اجرای Seeder برای اجرای Seeder شهرها، از دستور زیر استفاده کنید:
php artisan db:seed --class=CitySeeder
یا برای اجرای تمامی سیدر ها:
php artisan db:seed
گاهی در محیط پروداکشن سیدر ها ممکن است برای محافط از آسیب داده ها اجرا نشوند، برای این کار می توان از فلگ —force استفاده کرد، اما مراقب داده های خود باشید:
php artisan db:seed --force
پس از اجرای Seeder، جدول cities با داده های مشخص شده پر خواهد شد. این روش برای مقداردهی اولیه داده‌های ثابت مانند شهرها، دسته‌بندی‌ها، یا تنظیمات بسیار مفید است و در زمان تست یا توسعه پروژه استفاده می‌شود. استفاده از فکتوری ها در سیدر: همچنین می توانید یک فکتوری را در سیدر خود فراخوانی کنید و داده های تستی خود را از فکتوری ایجاد کنید:
# UserSeeder.php
public function run(): void
{
 User::factory()
   ->count(50)
   ->hasPosts(1)
   ->create();
}
فراخوانی سیدر های اضافی در یک سیدر: همچنین می توانید از متد call استفاده کنید و سیدر های دیگری را در سیدر خود فراخوانی و اجرا کنید:
# FolanSeeder.php
public function run(): void
{
 $this->call([
  UserSeeder::class,
  PostSeeder::class,
  CommentSeeder::class,
 ]);
}
بی صدا کردن رویداد های مدل: درصورت اجرای سیدر و ایجاد رکورد ها، رویداد های مدل ها نیز فراخوانی می شوند، شما می توانید با استفاده از تریت WithoutModelEvents، می توانید مانع فراخوانی این سیدر ها شوید:
class DatabaseSeeder extends Seeder
{
 use WithoutModelEvents;

 public function run(): void
 {
  $this->call([
   UserSeeder::class,
  ]);
 }
}
#laravel #لاراول #فصل_۵ @AmirhDeveloper .

درود به همه 🤝 دیشب حوصله م سر رفته بود و کاملا منطقی تصمیم گرفتم کتابخانه Laraquest که یک کتابخانه برای کار با ربات تلگرام ب
+2
درود به همه 🤝 دیشب حوصله م سر رفته بود و کاملا منطقی تصمیم گرفتم کتابخانه Laraquest که یک کتابخانه برای کار با ربات تلگرام به زبان PHP بود رو با زبان Go پیاده سازی کنم. تا امروز مشغولش بود و تونستم یک نسخه از اون رو تحت عنوان پکیجی برای Go توسعه بدم. - این پکیج هم مثل Laraquest که برای PHP بود دارای سینتکس هایلایتینگ خیلی پیشرفته ای هست که در تصاویر می تونید مشاهده کنید. - در حال حاضر با اخرین نسخه Bot API همگام هست و شامل تمامی متد ها و آپدیت ها هست. - سرعت قابل توجهی داره بدون در نظر گرفتم I/O همونطور که توی تصاویر هست 5 پیام رو حدود 50 میکرو ثانیه ارسال می کنه، یه چیزی معادل 0.05 میلی ثانیه. - ساختار ساده ای هم برای توسعه ربات داره. در آینده اگر مجدد حوصله م سر رفت فیچر های دیگه هم بهش اضافه میکنم، یا اگر کسی حوصله ش سر رفت اضافه کنه و PR بده. اگر تصمیم گرفتید یک روز با Go ربات بزنید این پکیج رو فراموش نکنید. در نهایت اگر مایل بودید با استار دادن از پروژه حمایت کنید. ❤️ Go Version: https://github.com/laraXgram/Laraquest-Go PHP Version: https://github.com/laraXgram/Laraquest @AmirhDeveloper .

فصل پنج - Migrations and Database بخش دوم - Factories در این قسمت به متد های مربوط به فکتوری ها و قابل فراخوانی از مدل ها می پردازیم. 1- متد factory برای ایجاد یک فکتوری جدید استفاده می‌شود. در نسخه‌های قدیمی لاراول این متد به طور خودکار در دسترس بود، اما در نسخه‌های جدید لاراول باید از Model::factory() استفاده کنید.
User::factory()->...
در اینجا از متد factory برای تولید یک فکتوری از مدل User استفاده شده است. 2- متد create برای ذخیره مدل‌های تولیدشده در پایگاه داده استفاده می‌شود. این متد رکورد جدید را در دیتابیس ذخیره می‌کند.
User::factory()->create();
در این مثال، کاربر جدیدی بر اساس فیلد های تعریف شده در UserFactory ایجاد و ذخیره می‌شود. 3- متد trashed برای فیلتر کردن مدل‌هایی که در حالت soft delete قرار دارند، استفاده می‌شود. این متد برای زمانی که می‌خواهید فقط مدل‌های حذف‌شده را ایجاد کنید مفید است.
User::factory()->trashed()->create();
در این مثال، کاربری که حذف شده است، ایجاد می‌شود. 4- متد make مشابه create است اما رکورد را ذخیره نمی‌کند. این متد فقط شی مدل را برمی‌گرداند و هیچ تغییراتی در دیتابیس ایجاد نمی‌کند.
$user = User::factory()->make();
در اینجا، یک مدل جدید ساخته می‌شود اما در پایگاه داده ذخیره نمی‌شود. 5- متد count برای مشخص کردن تعداد رکوردهایی است که باید ایجاد شوند.
User::factory()->count(10)->create();
در اینجا 10 کاربر ایجاد و در پایگاه داده ذخیره می‌شود. 6- متد suspended معمولاً به عنوان یک حالت (state) در فکتوری‌ها استفاده می‌شود. این متد یک وضعیت خاص (مثل تعلیق یا وضعیت غیر فعال) را به مدل اختصاص می‌دهد.
User::factory()->suspended()->create();
در اینجا، یک کاربر که در وضعیت تعلیق قرار دارد، ایجاد می‌شود. 7- متد state برای اعمال حالت‌های خاص (custom states) به مدل‌های تولید شده استفاده می‌شود. این متد به شما این امکان را می‌دهد که ویژگی‌های مدل را به صورت پویا تغییر دهید.
User::factory()->state([
 'email_verified_at' => null,
])->create();
در اینجا، یک کاربر تولید می‌شود که ایمیل او تایید نشده است. 8- متد has برای ایجاد روابط (مثل روابط hasMany) استفاده می‌شود. این متد به شما این امکان را می‌دهد که تعداد مدل‌های وابسته (مانند پست‌ها، کامنت‌ها و غیره) را که باید به مدل اصلی تعلق داشته باشند مشخص کنید.
User::factory()->has(Post::factory()->count(5))->create();
ابتدا یک کاربر جدید ایجاد می‌شود، سپس 5 پست مرتبط با این کاربر به طور خودکار ایجاد می‌شود. ای متد نیاز به پیاده سازی روابط مربوطه در مدل های مربوطه می باشد. 9- متد hasXXX این متد همان متد has می باشد اما به صورت داینامیک.
User::factory()->hasPosts(3)->create();
در اینجا، کاربری ایجاد می‌شود و به طور خودکار 3 پست برای او ایجاد می‌شود. بخش Posts در متد hasPosts درواقع نام رابطه posts در مدل User می باشد. 10- متد for برای تعریف یک رابطه به صورت خاص (معمولاً belongsTo) استفاده می‌شود. این متد به شما این امکان را می‌دهد که مدل‌های وابسته را به مدل اصلی اختصاص دهید.
Post::factory()->for(User::factory())->create();
در اینجا، یک پست ایجاد می‌شود که به طور خودکار به یک کاربر جدید تعلق دارد. 11- متد forXXX این متد همان متد for می باشد اما به صورت داینامیک.
Post::factory()->forUser($user)->create();
در اینجا، یک پست برای یک کاربر مشخص ایجاد می‌شود. بخش User در متد forUser درواقع رابطه user در مدل Post می باشد. 12- متد hasAttached برای ایجاد روابط وابسته بین مدل‌ها (مانند belongsToMany) استفاده می‌شود. این متد برای مدیریت روابط چند به چند (many-to-many) کاربرد دارد.
User::factory()->hasAttached(Role::factory(), 3)->create();
در اینجا، یک کاربر جدید ایجاد می‌شود و به طور خودکار به 3 نقش متصل می‌شود. 13- متد recycle برای استفاده از یک مدل موجود (که قبلاً ایجاد شده یا حذف نرم شده) در روابط مختلف میان مدل‌ها استفاده می‌شود. این متد به شما کمک می‌کند که یک مدل خاص را در فکتوری‌های مختلف برای ایجاد رکوردهای مرتبط استفاده کنید تا یک نسخه واحد از آن مدل برای همه روابط در فرآیند ساخت داده‌ها استفاده شود.
Ticket::factory()->recycle(Airline::factory()->create())->create();
در اینجا، ابتدا یک ایرلاین جدید ایجاد می‌شود، سپس متد recycle این ایرلاین را برای استفاده در بلیط‌ها و پروازهایی که ایجاد می‌شوند، انتخاب می‌کند. درواقع ایرلاین ایجاد شده در تمام بلیط‌ها و پروازهای موجود از قبل استفاده می‌شود. #laravel #لاراول #فصل_۵ @AmirhDeveloper .