یکی از قابلیت های جالبه لاراول اینه که میتونی خیلی ساده برای APIها محدودیت درخواست (Rate Limit) بذاری.
ولی جذابتر اینه که محدودیت میتونه بر اساس شرایط مختلف اعمال بشه،
مثلا:
🔹 اگه کاربر عضو تیم باشه → محدودیت بر اساس team_id
🔹 اگه کاربر پلن اشتراکی داشته باشه → محدودیت بر اساس نوع پلن
🔹 و اگه هیچکدوم نبودش → محدودیت پیشفرض بر اساس IP
این یعنی میتونی برای پلن رایگان محدودیت سختتر بذاری، برای پلن حرفهای محدودیت بیشتر، و برای تیمها محدودیت مشترک.
📌 نمونه کد در RouteServiceProvider:
🔥 با همین چند خط کد، میتونی مدیریت مصرف API رو هوشمند و حرفهای کنی، طوریکه هم کاربرا تجربه بهتری دارن، هم از تلاش های مخربه برخی کاربرا جلوگیری میشه.
#Laravel #لاراول
@GoldenCodeir
(به منبع و مثالش دقت کنید👇🏾)
https://x.com/wendell_adriel/status/1967552508647071760?s=35
ولی جذابتر اینه که محدودیت میتونه بر اساس شرایط مختلف اعمال بشه،
مثلا:
🔹 اگه کاربر عضو تیم باشه → محدودیت بر اساس team_id
🔹 اگه کاربر پلن اشتراکی داشته باشه → محدودیت بر اساس نوع پلن
🔹 و اگه هیچکدوم نبودش → محدودیت پیشفرض بر اساس IP
این یعنی میتونی برای پلن رایگان محدودیت سختتر بذاری، برای پلن حرفهای محدودیت بیشتر، و برای تیمها محدودیت مشترک.
📌 نمونه کد در RouteServiceProvider:
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
RateLimiter::for('api', function (Request $request) {
if ($request->user()?->team_id) {
// محدودیت مشترک برای کل تیم
return Limit::perMinute(100)->by($request->user()->team_id);
}
if ($request->user()?->plan) {
// محدودیت بر اساس پلن کاربر
return Limit::perMinute(200)->by($request->user()->id);
}
// محدودیت پیشفرض برای آیپی
return Limit::perMinute(60)->by($request->ip());
});
🔥 با همین چند خط کد، میتونی مدیریت مصرف API رو هوشمند و حرفهای کنی، طوریکه هم کاربرا تجربه بهتری دارن، هم از تلاش های مخربه برخی کاربرا جلوگیری میشه.
#Laravel #لاراول
@GoldenCodeir
(به منبع و مثالش دقت کنید👇🏾)
https://x.com/wendell_adriel/status/1967552508647071760?s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Rate limiting can be tricky sometimes, right? Not with Laravel.
Check how simple it is to apply a rate limit per team and plan, with a fallback for IP! 🔥
Rate limiting can be tricky sometimes, right? Not with Laravel.
Check how simple it is to apply a rate limit per team and plan, with a fallback for IP! 🔥
👍12🥰1
یکی از دغدغههای مهم در طراحی API اینه که اطلاعات اضافی نفرستیم.
چون:
حجم ریسپانس ها زیاد میشه و حجم منابع سرور افزایش پیدا میکنه و...
لاراول یه راهکار خیلی تمیز برای این موضوع داره: استفاده از API Resourceها.
🔹 مشکل رایج
فرض کنید میخوایم اطلاعات یک کاربر رو همراه با پستهاش برگردونیم.
معمولا شاید اینطوری عمل کنیم:
اینجا یه مشکل هست: حتی اگر posts رو لود نکرده باشیم، باز هم کلید posts توی JSON میاد (و معمولا query اضافه اجرا میشه).
لاراول متودی به اسم whenLoaded داره. این متود بررسی میکنه که آیا relation مورد نظر واقعاً لود شده یا نه.
✅ نتیجه:
اگر توی query نوشتیم:
اون موقع posts داخل JSON میاد.
اگر with('posts') رو ننوشتیم، اصلا posts توی خروجی دیده نمیشه.
📌 مزایا
شماره ۱ : API سبکتر → فقط دیتاهایی که لازم داری ارسال میشن.
شماره ۲: کد تمیزتر → دیگه خبری از if/else های شلوغ داخل Resource نیست.
شماره۳: کنترل کامل → هر relation فقط وقتی لود شده باشه به خروجی اضافه میشه.
خلاصه که:
وقتی داری API میسازی، همیشه به این فکر کن که چه دیتا ای لازمه سمت کاربر بیاد.
با استفاده از whenLoaded در لاراول، میتونی خروجیهات رو بهینه، تمیز و حرفهای نگه داری.
@GoldenCodeir
#Laravel #لاراول
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1967917256446267886?t=nJdmRFIvFlZGiL09jL8LuQ&s=35
چون:
حجم ریسپانس ها زیاد میشه و حجم منابع سرور افزایش پیدا میکنه و...
لاراول یه راهکار خیلی تمیز برای این موضوع داره: استفاده از API Resourceها.
🔹 مشکل رایج
فرض کنید میخوایم اطلاعات یک کاربر رو همراه با پستهاش برگردونیم.
معمولا شاید اینطوری عمل کنیم:
return [
'id' => $this->id,
'name' => $this->name,
'posts' => PostResource::collection($this->posts),
];
اینجا یه مشکل هست: حتی اگر posts رو لود نکرده باشیم، باز هم کلید posts توی JSON میاد (و معمولا query اضافه اجرا میشه).
لاراول متودی به اسم whenLoaded داره. این متود بررسی میکنه که آیا relation مورد نظر واقعاً لود شده یا نه.
return [
'id' => $this->id,
'name' => $this->name,
'posts' => PostResource::collection($this->whenLoaded('posts')),
];
✅ نتیجه:
اگر توی query نوشتیم:
User::with('posts')->get();اون موقع posts داخل JSON میاد.
اگر with('posts') رو ننوشتیم، اصلا posts توی خروجی دیده نمیشه.
📌 مزایا
شماره ۱ : API سبکتر → فقط دیتاهایی که لازم داری ارسال میشن.
شماره ۲: کد تمیزتر → دیگه خبری از if/else های شلوغ داخل Resource نیست.
شماره۳: کنترل کامل → هر relation فقط وقتی لود شده باشه به خروجی اضافه میشه.
خلاصه که:
وقتی داری API میسازی، همیشه به این فکر کن که چه دیتا ای لازمه سمت کاربر بیاد.
با استفاده از whenLoaded در لاراول، میتونی خروجیهات رو بهینه، تمیز و حرفهای نگه داری.
@GoldenCodeir
#Laravel #لاراول
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1967917256446267886?t=nJdmRFIvFlZGiL09jL8LuQ&s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Ship lighter APIs with Resources that only include loaded relations! ☁️
Laravel allows us to easily control the payload without if/else spaghetti! 🫶
Check the example to learn how! 🔥
Ship lighter APIs with Resources that only include loaded relations! ☁️
Laravel allows us to easily control the payload without if/else spaghetti! 🫶
Check the example to learn how! 🔥
👍15🔥1
Golden Code
خب بریم سراغ مفهوم Isolation (جداسازی) در ACID ✅️ وقتی یک برنامه با دیتابیس کار میکنه ممکنه چندین Transaction بطور همزمان اجرا بشن. هر transaction مجموعهای از عملیات روی دادههاس که باید بصورت یک واحد کامل انجام بشه. مفهومه Isolation اینه که transaction…
مفهوم D (Durability) در ACID
وقتی یک transaction در دیتابیس COMMIT میشه، باید مطمئن باشیم تغییراتش برای همیشه ذخیره شدن و حتی در صورت قطع برق یا crash سیستم از بین نمیرن. این همون Durability (ماندگاری) هستش.
💡یه مثال :
وقتی پول از حساب بانکیت به حسابه دوستت منتقل میشه و پیام "انتقال موفق بود" میگیری، حتی اگه برق دیتاسنتر قطع بشه، دیتابیس تضمین میکنه که تراکنش انجام شده . این همون Durability هستش.
📌 روشهای اصلی برای تضمین Durability:
شماره ۱. Write-Ahead Logging (WAL)
تغییرات ابتدا در WAL ثبت میشن و بعدش روی دادههای اصلی اعمال میشن.
تا زمانیکه تغییرات در WAL ثبت نشده باشن، هیچ تضمینی برای ماندگاری دادهها وجود نداره.
✅ در صورت crash، تراکنش های commit شده با WAL قابل بازیابی هستنن.
شماره ۲. Redo / Undo Logs
بخش Redo: مکانیزمی برای بازگرداندن تغییرات تراکنشهای commit شده پس از crash
بخش Undo: مکانیزمی برای rollback تراکنشهای ناقص یا aborted
📌 رایج در Oracle و SQL Server و بخش مهمی از Crash Recovery هستش.
شماره ۳. fsync / Force-write
بعده هر COMMIT، دادهها از حافظه کش و OS به دیسک واقعی منتقل میشن.
این کار امنیت دادهها رو بالا میبره، اما سرعت transaction هارو کمی کاهش میده.
شماره ۴. Replication & Backup
تغییرات میتونن روی سرورهای دیگه کپی بشن یا snapshot گرفته بشن.
📌 این روشها به تنهایی Durability رو تضمین نمیکنن و بیشتر برای Disaster Recovery کاربرد دارن.
Trade-off بین سرعت و ماندگاری (Performance vs Durability)
حالت strict: بعده هر transaction، همه تغییرات حتما روی دیسک نوشته میشن. درین حالت Durability بالاست، اما سرعت transaction ها کمتر خواهد بود.
حالت lazy: تغییرات ممکنه کمی دیرتر روی دیسک نوشته بشن. درین حالت سرعت transaction هابالاتره، اما Durability کمی پایینتر خواهد بود.
📌 مثال در دیتابیسها
PostgreSQL – synchronous_commit:
وقتی این تنظیم فعال باشه، بعده هر transaction، تغییرات حتما روی دیسک نوشته میشن تا Durability تضمین بشه. اگه غیرفعال باشه، transaction سریعتر انجام میشه ولی ممکنه تغییرات کمی دیرتر روی دیسک ذخیره بشن.
MySQL – innodb_flush_log_at_trx_commit:
اگه مقدار این پارامتر روی 1 باشه، بعده هر transaction، تغییرات فورا روی دیسک نوشته میشن (Durability بالا، سرعت کمتر). اگه مقدار روی 2 یا 0 باشه، سرعت بالاتره ولی ممکنه در صورت crash، آخرین transaction ها از دست برن.
#ACID #دیتابیس
@GoldenCodeir 🔥
وقتی یک transaction در دیتابیس COMMIT میشه، باید مطمئن باشیم تغییراتش برای همیشه ذخیره شدن و حتی در صورت قطع برق یا crash سیستم از بین نمیرن. این همون Durability (ماندگاری) هستش.
💡یه مثال :
وقتی پول از حساب بانکیت به حسابه دوستت منتقل میشه و پیام "انتقال موفق بود" میگیری، حتی اگه برق دیتاسنتر قطع بشه، دیتابیس تضمین میکنه که تراکنش انجام شده . این همون Durability هستش.
📌 روشهای اصلی برای تضمین Durability:
شماره ۱. Write-Ahead Logging (WAL)
تغییرات ابتدا در WAL ثبت میشن و بعدش روی دادههای اصلی اعمال میشن.
تا زمانیکه تغییرات در WAL ثبت نشده باشن، هیچ تضمینی برای ماندگاری دادهها وجود نداره.
✅ در صورت crash، تراکنش های commit شده با WAL قابل بازیابی هستنن.
شماره ۲. Redo / Undo Logs
بخش Redo: مکانیزمی برای بازگرداندن تغییرات تراکنشهای commit شده پس از crash
بخش Undo: مکانیزمی برای rollback تراکنشهای ناقص یا aborted
📌 رایج در Oracle و SQL Server و بخش مهمی از Crash Recovery هستش.
شماره ۳. fsync / Force-write
بعده هر COMMIT، دادهها از حافظه کش و OS به دیسک واقعی منتقل میشن.
این کار امنیت دادهها رو بالا میبره، اما سرعت transaction هارو کمی کاهش میده.
شماره ۴. Replication & Backup
تغییرات میتونن روی سرورهای دیگه کپی بشن یا snapshot گرفته بشن.
📌 این روشها به تنهایی Durability رو تضمین نمیکنن و بیشتر برای Disaster Recovery کاربرد دارن.
Trade-off بین سرعت و ماندگاری (Performance vs Durability)
حالت strict: بعده هر transaction، همه تغییرات حتما روی دیسک نوشته میشن. درین حالت Durability بالاست، اما سرعت transaction ها کمتر خواهد بود.
حالت lazy: تغییرات ممکنه کمی دیرتر روی دیسک نوشته بشن. درین حالت سرعت transaction هابالاتره، اما Durability کمی پایینتر خواهد بود.
📌 مثال در دیتابیسها
PostgreSQL – synchronous_commit:
وقتی این تنظیم فعال باشه، بعده هر transaction، تغییرات حتما روی دیسک نوشته میشن تا Durability تضمین بشه. اگه غیرفعال باشه، transaction سریعتر انجام میشه ولی ممکنه تغییرات کمی دیرتر روی دیسک ذخیره بشن.
MySQL – innodb_flush_log_at_trx_commit:
اگه مقدار این پارامتر روی 1 باشه، بعده هر transaction، تغییرات فورا روی دیسک نوشته میشن (Durability بالا، سرعت کمتر). اگه مقدار روی 2 یا 0 باشه، سرعت بالاتره ولی ممکنه در صورت crash، آخرین transaction ها از دست برن.
#ACID #دیتابیس
@GoldenCodeir 🔥
👍9❤1
خیلی مواقع بعده گرفتنه داده از دیتابیس، نیاز داریم سریع و تمیز به اطلاعات دسترسی داشته باشیم.
تابع array_column در PHP دقیقا برای همین ساخته شده!
🔹 چی کار میکنه؟
میتونه از یک آرایه چندبعدی، فقط یک ستون رو جداکنه.
حتی میتونه آرایه رو با کلید دلخواهتون reindex کنه.
این یعنی: دیگه لازم نیست هر بار روی آرایه حلقه بزنی و جستجو کنی، دسترسی مستقیم داری.
📌 یه مثال:
✅ حالا $indexed[2] مستقیما اطلاعات Sara رو برمیگردونه،
بدون هیچ حلقه یا جستجوی اضافه.
کاربردهاش؟
ساخت lookup table سریع
کدنویسی تمیزتر و کوتاهتر
عالی برای caching و join کردن دیتاستها
خلاصه که : با array_column میتونیم از یک آرایه ساده، یک ساختار قوی برای دسترسی مستقیم بسازیم.
یک ترفند کوچیک، اما تاثیره بزرگ در سرعت و خوانایی کد.
#php #اموزش_php #php_tip
@GoldenCodeir
(به منبع و مثالش توجه کنید👇🏾)
https://x.com/wendell_adriel/status/1969010695279989061?t=h88vjyQnlMap9vvVDFxhXQ&s=35
تابع array_column در PHP دقیقا برای همین ساخته شده!
🔹 چی کار میکنه؟
میتونه از یک آرایه چندبعدی، فقط یک ستون رو جداکنه.
حتی میتونه آرایه رو با کلید دلخواهتون reindex کنه.
این یعنی: دیگه لازم نیست هر بار روی آرایه حلقه بزنی و جستجو کنی، دسترسی مستقیم داری.
📌 یه مثال:
$users = [
['id' => 1, 'name' => 'Ali', 'email' => 'ali@example.com'],
['id' => 2, 'name' => 'Sara', 'email' => 'sara@example.com'],
['id' => 3, 'name' => 'Reza', 'email' => 'reza@example.com'],
];
// Reindex بر اساس id
$indexed = array_column($users, null, 'id');
✅ حالا $indexed[2] مستقیما اطلاعات Sara رو برمیگردونه،
بدون هیچ حلقه یا جستجوی اضافه.
کاربردهاش؟
ساخت lookup table سریع
کدنویسی تمیزتر و کوتاهتر
عالی برای caching و join کردن دیتاستها
خلاصه که : با array_column میتونیم از یک آرایه ساده، یک ساختار قوی برای دسترسی مستقیم بسازیم.
یک ترفند کوچیک، اما تاثیره بزرگ در سرعت و خوانایی کد.
#php #اموزش_php #php_tip
@GoldenCodeir
(به منبع و مثالش توجه کنید👇🏾)
https://x.com/wendell_adriel/status/1969010695279989061?t=h88vjyQnlMap9vvVDFxhXQ&s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
PHP Tip 🚀
Using the array_column function, you can reindex a result set by one of its values easily.
This can allow lookups to become direct with a clean code. Great for caching for when you need to join across multiple datasets.
Check the example to learn…
Using the array_column function, you can reindex a result set by one of its values easily.
This can allow lookups to become direct with a clean code. Great for caching for when you need to join across multiple datasets.
Check the example to learn…
👍11
در لاراول وقتی از متود withDefault() در رابطهی Eloquent استفاده میکنیم، چه کاری انجام میده برامون؟
Anonymous Quiz
17%
بطور پیشفرض یک مدل مرتبط جدید در دیتابیس ایجاد میکنه
36%
اگر رابطه null بود، یک آبجکت خالی از مدل مرتبط برمیگردونه
23%
مقدار پیشفرض ستون foreign key رو تنظیم میکنه
23%
باعث eager loading پیشفرض میشه
👍14🔥2⚡1
یکی از قابلیتهای جذاب کش در لاراول، Cache Tags هست.
با Tag میتونی چند داده کش شده رو زیر یک تگ مشخص گروهبندی کنی. اینطوری مدیریت اونا (پاککردن یا بروزرسانی) خیلی راحتتر میشه.
📌 چرا به درد میخوره؟
فرض کن اپلیکیشن چند تیمی (multi-tenant) داری. هر تیم تنظیمات خودشو داره که توی کش ذخیره میکنی.
حالا اگه بخوای همه کشهای مربوط به یک تیم خاص رو پاک کنی، با Tag خیلی ساده میشه:
⚠️ یه نکته مهم
این Cache Tags فقط روی درایورهای Redis و Memcached پشتیبانی میشن.
روی file، database یا dynamodb کار نمیکنه.
خلاصه که:
با استفاده از Tag میتونی کش های مرتبط رو یکجا مدیریتشون کنی، بدون نیاز به دونستن کلیدهای مختلف.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1971180406717210806?t=l7I87aVOAwuBep_DjhW18A&s=35
با Tag میتونی چند داده کش شده رو زیر یک تگ مشخص گروهبندی کنی. اینطوری مدیریت اونا (پاککردن یا بروزرسانی) خیلی راحتتر میشه.
📌 چرا به درد میخوره؟
فرض کن اپلیکیشن چند تیمی (multi-tenant) داری. هر تیم تنظیمات خودشو داره که توی کش ذخیره میکنی.
حالا اگه بخوای همه کشهای مربوط به یک تیم خاص رو پاک کنی، با Tag خیلی ساده میشه:
// ذخیره دادهها با تگ team-1
Cache::tags(['team-1'])->put('settings', ['lang' => 'fa', 'timezone' => 'Asia/Tehran'], 3600);
// ذخیره داده دیگه با همون تگ
Cache::tags(['team-1'])->put('members', ['Ali', 'Sara'], 3600);
// پاک کردن همه کشهای team-1
Cache::tags(['team-1'])->flush();
⚠️ یه نکته مهم
این Cache Tags فقط روی درایورهای Redis و Memcached پشتیبانی میشن.
روی file، database یا dynamodb کار نمیکنه.
خلاصه که:
با استفاده از Tag میتونی کش های مرتبط رو یکجا مدیریتشون کنی، بدون نیاز به دونستن کلیدهای مختلف.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1971180406717210806?t=l7I87aVOAwuBep_DjhW18A&s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Laravel Cache system provides a way to work with tags, providing an efficient way to group different values under the same tag.
For example, you can create a cache tag for each team that uses your application and if a setting for that team…
Laravel Cache system provides a way to work with tags, providing an efficient way to group different values under the same tag.
For example, you can create a cache tag for each team that uses your application and if a setting for that team…
👍8👏2
در نسخهی ۱۲ لاراول، یک قابلیت کاربردی اضافه شده:
میتونید ستونهای Eloquent رو بصورت خودکار به رشته HTML امن (HtmlString) cast کنید.
🔹 چرا مهمه؟
وقتی ستونی مثل content یا denoscription شامل HTML باشه، معمولا باید توی Blade با {!! !!} چاپش کنیم. اما حالا لاراول خودش این کار رو مدیریت میکنه و مقدار رو به صورت HtmlString برمیگردونه.
📌 یه مثال
حالا براحتی میتونین در Blade بنویسین:
{{ $post->content }}
و خروجی HTML به درستی رندر میشه
نتیجش:
با AsHtmlString::class کدی تمیزتر، امنتر و راحتتر برای کار با ستونهای حاوی HTML در لاراول 12 خواهیم داشت.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/iamgurmandeep/status/1972171914891207129?t=p2MJGutuSORj99oSJ5woww&s=35
میتونید ستونهای Eloquent رو بصورت خودکار به رشته HTML امن (HtmlString) cast کنید.
🔹 چرا مهمه؟
وقتی ستونی مثل content یا denoscription شامل HTML باشه، معمولا باید توی Blade با {!! !!} چاپش کنیم. اما حالا لاراول خودش این کار رو مدیریت میکنه و مقدار رو به صورت HtmlString برمیگردونه.
📌 یه مثال
use Illuminate\Database\Eloquent\Casts\AsHtmlString;
class Post extends Model
{
protected $casts = [
'content' => AsHtmlString::class,
];
}
حالا براحتی میتونین در Blade بنویسین:
{{ $post->content }}
و خروجی HTML به درستی رندر میشه
نتیجش:
با AsHtmlString::class کدی تمیزتر، امنتر و راحتتر برای کار با ستونهای حاوی HTML در لاراول 12 خواهیم داشت.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/iamgurmandeep/status/1972171914891207129?t=p2MJGutuSORj99oSJ5woww&s=35
X (formerly Twitter)
Gurmandeep Singh (@iamgurmandeep) on X
#Laravel Tip 🚀
In Laravel 12, you can automatically cast Eloquent attributes to HTML strings using `AsHtmlString::class`.
In Laravel 12, you can automatically cast Eloquent attributes to HTML strings using `AsHtmlString::class`.
👍14❤4
وقتی با Eloquent توی لاراول کار میکنیم، معمولا برای فیلتر کردن رکوردها از where استفاده میکنیم. مثلا:
این روش خوبه، اما لاراول یه قابلیت بهتر و کاربردی داره به اسم Dynamic Where ✨
یعنی میتونیم همون کد بالا رو اینطوری بنویسیم:
چطوری کار میکنه؟
لاراول متود رو از روی اسمش میسازه.
وقتی میگی whereEmailAndPassword، خودش میفهمه باید روی ستونهای email و password شرط بذاره.
بین فیلدها میتونی از And یا Or استفاده کنی.
مثال:
📌 کجا به درد میخوره؟
لاگین یا احراز هویت سریع
جستجوهای ساده و کوتاه
کار با کلیدهای ترکیبی (Composite Keys)
خصلاش که:
این Dynamic Where خیلی وقتها باعث میشن کد کوتاهتر، خواناتر و باشه.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/Akr4mKhan/status/1973387425268507003?t=PqAyceJRXsgErfUOp8_wtQ&s=35
User::where('email', $email)
->where('password', $password)
->first();این روش خوبه، اما لاراول یه قابلیت بهتر و کاربردی داره به اسم Dynamic Where ✨
یعنی میتونیم همون کد بالا رو اینطوری بنویسیم:
User::whereEmailAndPassword($email, $password)->first();
چطوری کار میکنه؟
لاراول متود رو از روی اسمش میسازه.
وقتی میگی whereEmailAndPassword، خودش میفهمه باید روی ستونهای email و password شرط بذاره.
بین فیلدها میتونی از And یا Or استفاده کنی.
مثال:
// شرط روی دو ستون
User::whereNameAndAge('Ali', 30)->first();
// شرط OR
User::whereEmailOrUsername($value, $value)->first();
📌 کجا به درد میخوره؟
لاگین یا احراز هویت سریع
جستجوهای ساده و کوتاه
کار با کلیدهای ترکیبی (Composite Keys)
خصلاش که:
این Dynamic Where خیلی وقتها باعث میشن کد کوتاهتر، خواناتر و باشه.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/Akr4mKhan/status/1973387425268507003?t=PqAyceJRXsgErfUOp8_wtQ&s=35
X (formerly Twitter)
Akram ⚡️ (@Akr4mKhan) on X
Option B: #Laravel Tips 💡
1️⃣ Dynamic wheres aren't just cute - they’re super handy for quick lookups without repeating ->where()->where() chains. Perfect for things like login, lookups, or finding by composite keys.
1️⃣ Dynamic wheres aren't just cute - they’re super handy for quick lookups without repeating ->where()->where() chains. Perfect for things like login, lookups, or finding by composite keys.
👍16🔥1🥰1
Forwarded from Linuxor ?
ولی اگه از برنامه نویسی نمی تونین پول دربیارین زیاد خودتونو ناراحت نکنین
ذات درست پول در آوردن از برنامه نویسی بیشتر Passive هستش (یعنی کاری نکنین و پول در بیارین) و نسبت به درآمد های Active خیلی دیرتر نتیجه میده ولی نتیجه بده میبرتتون هوا، درآمد های Passive همه نوع آزادی بهتون میده از آزادی وقت بگیر تا امنیت پولی و آرامش روانی؛ اگه دارین به صورت Passive حتی یک میلیون در ماه هم در میآرین ارزشش رو 100 برابر در نظر بگیرید.
فقط حواستون باشه اگه خونه مادرتون زندگی میکنید مادرتون این قضیه رو نفهمه، چون مجبورتون میکنه برید یه جا یه کار محکم پیدا کنید و باید بهش اثبات کنید که دارید کار میکنید و ریموت هم قبول نیست 6 صبح باید بری بیرون خودش هم واست صبحونه درست میکنه
@Linuxor
ذات درست پول در آوردن از برنامه نویسی بیشتر Passive هستش (یعنی کاری نکنین و پول در بیارین) و نسبت به درآمد های Active خیلی دیرتر نتیجه میده ولی نتیجه بده میبرتتون هوا، درآمد های Passive همه نوع آزادی بهتون میده از آزادی وقت بگیر تا امنیت پولی و آرامش روانی؛ اگه دارین به صورت Passive حتی یک میلیون در ماه هم در میآرین ارزشش رو 100 برابر در نظر بگیرید.
فقط حواستون باشه اگه خونه مادرتون زندگی میکنید مادرتون این قضیه رو نفهمه، چون مجبورتون میکنه برید یه جا یه کار محکم پیدا کنید و باید بهش اثبات کنید که دارید کار میکنید و ریموت هم قبول نیست 6 صبح باید بری بیرون خودش هم واست صبحونه درست میکنه
@Linuxor
👍21😁4❤3
در بسیاری از پروژهها وقتی داخل یک database transaction هستیم، نیاز داریم بعد از ذخیرهی موفق دیتاها یک Event اجرا کنیم (مثل ارسال ایمیل، ثبت لاگ یا بروزرسانی سرویس خارجی).
اما اگه Event قبل از commit اجرا بشه و transaction به هر دلیلی rollback بشه، یک ناسازگاری بزرگ به وجود میاد:
کاربر ایمیل "ثبت موفق" دریافت میکنه، در حالیکه دیتایی ذخیره نشده.
سرویس خارجی بروزرسانی میشه، در حالیکه دیتابیس شما تغییر نکرده.
🔴 این یعنی Event شما از وضعیت واقعی دیتابیس عقب میمونه.
📌 راهحل لاراول براش:
لاراول برای این سناریو یک راهحل خیلی تمیز ارائه داده:
کافیه Event شما این اینترفیس رو پیادهسازی کنه:
وقتی این Event رو dispatch کنید:
لاراول تضمین میکنه که اجرای Event فقط بعده موفقیت کامل transaction و commit نهایی اتفاق بیفته.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1974077531943838164?t=ZlSaB6_aM-qXwNDa_ttadw&s=35
اما اگه Event قبل از commit اجرا بشه و transaction به هر دلیلی rollback بشه، یک ناسازگاری بزرگ به وجود میاد:
کاربر ایمیل "ثبت موفق" دریافت میکنه، در حالیکه دیتایی ذخیره نشده.
سرویس خارجی بروزرسانی میشه، در حالیکه دیتابیس شما تغییر نکرده.
🔴 این یعنی Event شما از وضعیت واقعی دیتابیس عقب میمونه.
📌 راهحل لاراول براش:
لاراول برای این سناریو یک راهحل خیلی تمیز ارائه داده:
کافیه Event شما این اینترفیس رو پیادهسازی کنه:
use Illuminate\Contracts\Events\ShouldDispatchAfterCommit;
class OrderCreated implements ShouldDispatchAfterCommit
{
public $order;
public function __construct($order)
{
$this->order = $order;
}
}
وقتی این Event رو dispatch کنید:
event(new OrderCreated($order));
لاراول تضمین میکنه که اجرای Event فقط بعده موفقیت کامل transaction و commit نهایی اتفاق بیفته.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1974077531943838164?t=ZlSaB6_aM-qXwNDa_ttadw&s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Yesterday I talked about the DB::afterCommit, on the same topic, if you want to dispatch events only after the DB transaction has been committed, you can do it by making your Event class implement the Illuminate\Contracts\Events\ShouldDispatchAfterCommit…
Yesterday I talked about the DB::afterCommit, on the same topic, if you want to dispatch events only after the DB transaction has been committed, you can do it by making your Event class implement the Illuminate\Contracts\Events\ShouldDispatchAfterCommit…
👍11❤2
این هلپرفانکشن tap() یکی از اون ویژگیهای جالبه لاراوله که باعث میشه کدها هم تمیزتر بشن، هم خواناتر.
گاهی لازمه روی یه شی عملی انجام بدی (مثلن تغییر، ذخیره یا لاگ گرفتن)
اما در نهایت بخوای خود اون شی رو برگردونی و نه نتیجهی عملیات.
اینجاست که tap() کاربرد داره.
📌 مثال:
در اینجا:
داخل tap() با $user هر کاری خواستیم کردیم؛
ولی خروجی، همون $user هست — نه نتیجهی تابع.
کاربرد اصلی وقتی وسط یه chain از متودها بخوای کاری انجام بدی، بدون اینکه زنجیره قطع بشه:
یا حتی داخل Query Builder:
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1974074465010208832?t=neGDBuWocqlJjIOARSUOmg&s=35
گاهی لازمه روی یه شی عملی انجام بدی (مثلن تغییر، ذخیره یا لاگ گرفتن)
اما در نهایت بخوای خود اون شی رو برگردونی و نه نتیجهی عملیات.
اینجاست که tap() کاربرد داره.
📌 مثال:
$user = tap(new User, function ($user) {
$user->name = 'Ali';
$user->email = 'ali@example.com';
$user->save();
});در اینجا:
داخل tap() با $user هر کاری خواستیم کردیم؛
ولی خروجی، همون $user هست — نه نتیجهی تابع.
کاربرد اصلی وقتی وسط یه chain از متودها بخوای کاری انجام بدی، بدون اینکه زنجیره قطع بشه:
return tap(User::find(1))
->update(['active' => false])
->refresh();
یا حتی داخل Query Builder:
$users = tap(DB::table('users'), function ($query) {
$query->where('active', true);
})->get();#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1974074465010208832?t=neGDBuWocqlJjIOARSUOmg&s=35
X (formerly Twitter)
Backpack for Laravel (@laravelbackpack) on X
#Laravel Tip
Did you know.... tap() = Tweak and Return 🪄
Yes, Laravel's tap() lets you modify an object and return it — perfect for clean, chainable code.
Did you know.... tap() = Tweak and Return 🪄
Yes, Laravel's tap() lets you modify an object and return it — perfect for clean, chainable code.
👍7❤2
در Service Container لاراول، متود bindIf() چه تفاوتی با bind() داره؟
Anonymous Quiz
10%
همیشه جایگزین بایند قبلی میشود.
66%
فقط زمانی بایند میکند که کلید قبلا بایند نشده باشد.
14%
فقط در زمان resolve بایند را ثبت میکند.
10%
فقط در بایندهای singleton میتونه موثر باشه.
👍7
یک برنامه نویس تنبل
🔶 بوت استرپ نسخه ۶ افزودن کلاس های جدید برای ایحاد رنگ بندی جدید @TheRaymondDev
نگاهی به تغییرات مهم نسخه 6
طبق اعلام تیم Bootstrap، در نسخهی Bootstrap v6 سیستم رنگ و تم به شکل کامل بازطراحی خواهد شد.
هدف؟؟
سادگی بیشتر، هماهنگی بین کامپوننتها و پشتیبانی هوشمند از حالت تیره و روشن.
کلاسهای سراسری بهجای کلاسهای اختصاصی
قبلن برای هر کامپوننت کلاس جدا داشتیم مثل:
.btn-primary یا .alert-primary.
📌 اما در نسخه 6، کلاسهای رنگی سراسری شدن — مثلن فقط از .theme-primary استفاده میکنید و همهی اجزای داخل اون از همون تم پیروی میکنند.
کد سادهتر، طراحی منسجمتر
تطبیق خودکار با حالت تیره/روشن
نسخه جدید از تابع مدرن CSS بنام light-dark() استفاده میکنه،
بنابرین رنگها بهصورت خودکار با حالت سیستم (Dark/Light Mode) هماهنگ میشن — بدون نیاز به media query.
رنگها
رنگهای تازه مثل Violet، Amber، Lime، Brown و Pewter اضافه شدهاند.
همچنین، درجات خیلی روشن و خیلی تیره (025, 050, 950, 975) برای هر رنگ در دسترسه.
📎 در کل:
نسخهی 6 تمرکز داره روی این موارد:
یکپارچهسازی تمها،
کاهش تکرار در کلاسها،
و پشتیبانی هوشمند از حالت تیره.
نتیجش هم طراحی سادهتر، مدرنتر و حرفهایتر برای تمام کامپوننتها.
#bootstrap #بوت_استرپ #فرانت
@GoldenCodeir 🔥
(منبع👇🏾 )
https://x.com/getbootstrap/status/1975652460992835762?t=Iqg0G6PDseMk691A4Gbj5A&s=35
طبق اعلام تیم Bootstrap، در نسخهی Bootstrap v6 سیستم رنگ و تم به شکل کامل بازطراحی خواهد شد.
هدف؟؟
سادگی بیشتر، هماهنگی بین کامپوننتها و پشتیبانی هوشمند از حالت تیره و روشن.
کلاسهای سراسری بهجای کلاسهای اختصاصی
قبلن برای هر کامپوننت کلاس جدا داشتیم مثل:
.btn-primary یا .alert-primary.
📌 اما در نسخه 6، کلاسهای رنگی سراسری شدن — مثلن فقط از .theme-primary استفاده میکنید و همهی اجزای داخل اون از همون تم پیروی میکنند.
کد سادهتر، طراحی منسجمتر
تطبیق خودکار با حالت تیره/روشن
نسخه جدید از تابع مدرن CSS بنام light-dark() استفاده میکنه،
بنابرین رنگها بهصورت خودکار با حالت سیستم (Dark/Light Mode) هماهنگ میشن — بدون نیاز به media query.
رنگها
رنگهای تازه مثل Violet، Amber، Lime، Brown و Pewter اضافه شدهاند.
همچنین، درجات خیلی روشن و خیلی تیره (025, 050, 950, 975) برای هر رنگ در دسترسه.
📎 در کل:
نسخهی 6 تمرکز داره روی این موارد:
یکپارچهسازی تمها،
کاهش تکرار در کلاسها،
و پشتیبانی هوشمند از حالت تیره.
نتیجش هم طراحی سادهتر، مدرنتر و حرفهایتر برای تمام کامپوننتها.
#bootstrap #بوت_استرپ #فرانت
@GoldenCodeir 🔥
(منبع👇🏾 )
https://x.com/getbootstrap/status/1975652460992835762?t=Iqg0G6PDseMk691A4Gbj5A&s=35
X (formerly Twitter)
Bootstrap (@getbootstrap) on X
Lots of happenings lately for v6's development!
One new idea is to move from component-specific modifiers to global ones. Take this example—use `.theme-primary` on all components, or on a parent, and even override where needed.
Also, spot the new button…
One new idea is to move from component-specific modifiers to global ones. Take this example—use `.theme-primary` on all components, or on a parent, and even override where needed.
Also, spot the new button…
👍9
اصل S در اصول SOLID یعنی Single Responsibility Principle (اصل تک مسئولیتی)
چی میگه؟
یک کلاس باید فقط یک مسئولیت داشته باشه و فقط یک دلیل برای تغییر. یعنی هر کلاس باید یک نقش مشخص در سیستم داشته باشه و همه کارها رو قاطی نکنه.
چرا این مهمترین اصل SOLIDهستش؟
وقتی یک کلاس چند مسئولیت داشته باشه:
پیدا کردن و رفع باگ سخت میشه،
تغییرات کوچیک تو یه قسمت ممکنه باعث خرابی بخشهای دیگه بشه،
توسعه و نگهداری پروژه با مشکل مواجه میشه و تیمها بیشتر زمانشون رو صرف درست کردن کد میکنن تا اضافه کردن ویژگیهای جدید.
نتیجش:
با رعایت این اصل، کد تمیزتر، قابل فهمتر و قابل تستتر میشه.
کلاسها سادهتر هستند و وقتی نیاز به تغییر باشه، فقط بخش مرتبط اصلاح میشه بدون اینکه باقی سیستم آسیب ببینه.
#SOLID
@GoldenCodeir 🔥
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-activity-7382848511261773824-diAJ?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
چی میگه؟
یک کلاس باید فقط یک مسئولیت داشته باشه و فقط یک دلیل برای تغییر. یعنی هر کلاس باید یک نقش مشخص در سیستم داشته باشه و همه کارها رو قاطی نکنه.
چرا این مهمترین اصل SOLIDهستش؟
وقتی یک کلاس چند مسئولیت داشته باشه:
پیدا کردن و رفع باگ سخت میشه،
تغییرات کوچیک تو یه قسمت ممکنه باعث خرابی بخشهای دیگه بشه،
توسعه و نگهداری پروژه با مشکل مواجه میشه و تیمها بیشتر زمانشون رو صرف درست کردن کد میکنن تا اضافه کردن ویژگیهای جدید.
نتیجش:
با رعایت این اصل، کد تمیزتر، قابل فهمتر و قابل تستتر میشه.
کلاسها سادهتر هستند و وقتی نیاز به تغییر باشه، فقط بخش مرتبط اصلاح میشه بدون اینکه باقی سیستم آسیب ببینه.
#SOLID
@GoldenCodeir 🔥
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-activity-7382848511261773824-diAJ?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
👍10❤1
Forwarded from DevTwitter | توییت برنامه نویسی
بلاخره React از مِتا جدا شد!
بعد بیش از ۱۰ سال، React قراره تحت یه بنیاد مستقل به نام React Foundation اداره بشه ( زیر چتر Linux Foundation )
یعنی از این به بعد تصمیم گیری ها و سرنوشت ری اکت، دیگه فقط دست Meta نیست و جامعه دولوپرها و شرکتهای دیگه هم تو جهت دهی آینده React نقش دارن!
و این یعنی شفافیت، مشارکت و تنوع بیشتر در توسعه کتابخونه دوست داشتنی ری اکت
بنظرم React داره یه فصل جدید از داستانش رو شروع میکنه…
ری اکت دیگه صرفا پروژه یه شرکت نیست، بلکه نتیجه ی همکاری یه جامعه ی جهانی از دولوپر هاست
@DevTwitter | <Ahmad Ahmad-Nejad/>
بعد بیش از ۱۰ سال، React قراره تحت یه بنیاد مستقل به نام React Foundation اداره بشه ( زیر چتر Linux Foundation )
یعنی از این به بعد تصمیم گیری ها و سرنوشت ری اکت، دیگه فقط دست Meta نیست و جامعه دولوپرها و شرکتهای دیگه هم تو جهت دهی آینده React نقش دارن!
و این یعنی شفافیت، مشارکت و تنوع بیشتر در توسعه کتابخونه دوست داشتنی ری اکت
بنظرم React داره یه فصل جدید از داستانش رو شروع میکنه…
ری اکت دیگه صرفا پروژه یه شرکت نیست، بلکه نتیجه ی همکاری یه جامعه ی جهانی از دولوپر هاست
@DevTwitter | <Ahmad Ahmad-Nejad/>
👍13🔥2
متود mode() یکی از متودهای کاربردیه کالکشن های لاراول است که پر تکرارترین مقدار داخل یک Collection رو برمیگردونه.
مثال:
📌 نکته:
خروجی به صورت آرایه هستش چون ممکنه چند مقدار با بیشترین تکرار وجود داشته باشه.
فرض کنین میخواید در سیستم سفارشات، محبوبترین روش ارسال کالا در ۳۰ روز گذشته برای هر تیم رو بصورت خودکار انتخاب کنید. متود mode() بهترین گزینس چون هم مقدار پر تکرار رو بر میگردونه و هم اگه چند روش ارسال تعداد تکرار برابر داشتند، بصورت کامل مدیریت میکنه.
خلاصش که:
متود mode() سادهترین راه برای گرفتن پرکاربردترین یا پر تکرارترین مقدار از دادههای جمعآوری شده هستش.
#Laravel #laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1977713885433012395?t=ukkZaeMjXG9DkTk7wfrCIA&s=35
مثال:
$collection = collect([1, 2, 2, 3, 3, 3, 4]);
$mostFrequent = $collection->mode();
// خروجی: [3]
📌 نکته:
خروجی به صورت آرایه هستش چون ممکنه چند مقدار با بیشترین تکرار وجود داشته باشه.
فرض کنین میخواید در سیستم سفارشات، محبوبترین روش ارسال کالا در ۳۰ روز گذشته برای هر تیم رو بصورت خودکار انتخاب کنید. متود mode() بهترین گزینس چون هم مقدار پر تکرار رو بر میگردونه و هم اگه چند روش ارسال تعداد تکرار برابر داشتند، بصورت کامل مدیریت میکنه.
خلاصش که:
متود mode() سادهترین راه برای گرفتن پرکاربردترین یا پر تکرارترین مقدار از دادههای جمعآوری شده هستش.
#Laravel #laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/wendell_adriel/status/1977713885433012395?t=ukkZaeMjXG9DkTk7wfrCIA&s=35
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Do you know the mode() method from Laravel Collections? It returns the most frequent value for a given collection (or key).
In the example, we use it to auto-select the most-used shipping method from the last 30 days per team, also handling…
Do you know the mode() method from Laravel Collections? It returns the most frequent value for a given collection (or key).
In the example, we use it to auto-select the most-used shipping method from the last 30 days per team, also handling…
👍15
Golden Code
اصل S در اصول SOLID یعنی Single Responsibility Principle (اصل تک مسئولیتی) چی میگه؟ یک کلاس باید فقط یک مسئولیت داشته باشه و فقط یک دلیل برای تغییر. یعنی هر کلاس باید یک نقش مشخص در سیستم داشته باشه و همه کارها رو قاطی نکنه. چرا این مهمترین اصل SOLIDهستش؟…
اصل open closed در اصول SOLID چی میگه؟
این اصل میگه که:
کلاسها، ماژولها یا توابع باید برای توسعه باز باشند ولی برای تغییر بسته باشند.
به عبارت دیگه، سیستم نرمافزاری باید به گونهای طراحی بشه که قابلیت افزودن ویژگیهای جدید بدون نیاز به تغییر در کدهای موجود فراهم باشه. این رویکرد باعث کاهش ریسک خطا و افزایش پایداری نرمافزار میشه.
📌 اهمیت open closed
کاهش خطا و باگها:
با اجتناب از تغییر کدهای تستشده، احتمال ورود خطاهای جدید کمتر میشه.
افزایش انعطافپذیری:
افزودن قابلیتهای جدید بدون دستکاری کدهای قبلی امکانپذیره .
نگهداری آسون تر:
توسعهدهندگان اینطوری میتونن بدون نگرانی از تاثیر تغییرات، روی توسعه کار کنند.
بهبود کیفیت:
کدهای قابل توسعه، سرمایه بلندمدت تیمهای نرمافزاری هستند.
📌 خلاصش که:
اصل open closed یکی از مهمترین اصول طراحی نرمافزاره که با رعایتش، توسعه نرمافزار هم سادهتر و هم مطمئنتر میشه. اگه میخواید پروژههای نرمافزاریتون در طول زمان قابلیت رشد داشته باشن و تیم توسعه دغدغه کمتری برای تغییرات داشته باشه این اصل رو جدی بگیرید.
#SOLID #OpenClosedPrinciple
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-openclosedprinciple-share-7384671951681691649-2OGj?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
این اصل میگه که:
کلاسها، ماژولها یا توابع باید برای توسعه باز باشند ولی برای تغییر بسته باشند.
به عبارت دیگه، سیستم نرمافزاری باید به گونهای طراحی بشه که قابلیت افزودن ویژگیهای جدید بدون نیاز به تغییر در کدهای موجود فراهم باشه. این رویکرد باعث کاهش ریسک خطا و افزایش پایداری نرمافزار میشه.
📌 اهمیت open closed
کاهش خطا و باگها:
با اجتناب از تغییر کدهای تستشده، احتمال ورود خطاهای جدید کمتر میشه.
افزایش انعطافپذیری:
افزودن قابلیتهای جدید بدون دستکاری کدهای قبلی امکانپذیره .
نگهداری آسون تر:
توسعهدهندگان اینطوری میتونن بدون نگرانی از تاثیر تغییرات، روی توسعه کار کنند.
بهبود کیفیت:
کدهای قابل توسعه، سرمایه بلندمدت تیمهای نرمافزاری هستند.
📌 خلاصش که:
اصل open closed یکی از مهمترین اصول طراحی نرمافزاره که با رعایتش، توسعه نرمافزار هم سادهتر و هم مطمئنتر میشه. اگه میخواید پروژههای نرمافزاریتون در طول زمان قابلیت رشد داشته باشن و تیم توسعه دغدغه کمتری برای تغییرات داشته باشه این اصل رو جدی بگیرید.
#SOLID #OpenClosedPrinciple
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-openclosedprinciple-share-7384671951681691649-2OGj?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
👍7
لاراول از قابلیت Task Scheduling بسیار قدرتمندی برخورداره. دو متود خیلی کاربردی درین زمینه وجود داره:
🔹 pingOnSuccess()
🔹 pingOnFailure()
این متودها به شما اجازه میدن بعد از اجرای یک تسک، بصورت خودکار درخواست HTTP به یک وبهوک یا API بفرستین.
📌 مثلا:
فرض کنین در پروژتون یک تسک بکاپگیری خودکار دارین که هر شب اجرا میشه.
بعد از اتمام موفقیت آمیزه بکاپ، میخواید یک سرویس مانیتورینگ رو مطلع کنید که همه چی اوکی بوده و میتونه لاگها رو آرشیو کنه. برای این کار با pingOnSuccess() میتونید به راحتی یک درخواست HTTP به سرویس مانیتورینگ بفرستید.
از طرفی اگه عملیات بکاپ fail شد، با pingOnFailure() میتونین سریع یک هشدار به تیمتون یا سرویس اعلان بفرستید تا موضوع بررسی بشه.
چرا مهمه؟
این قابلیت کمک میکنه workflow بین سرویسها به شکل اتوماتیک و مطمئن کنترل بشه و در صورت بروز خطا سریع واکنش داده بشه.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید👇🏾)
https://x.com/wendell_adriel/status/1979151691023810615?t=om0EwaeLVurWj05Rmxl5Tg&s=19
🔹 pingOnSuccess()
🔹 pingOnFailure()
این متودها به شما اجازه میدن بعد از اجرای یک تسک، بصورت خودکار درخواست HTTP به یک وبهوک یا API بفرستین.
📌 مثلا:
فرض کنین در پروژتون یک تسک بکاپگیری خودکار دارین که هر شب اجرا میشه.
بعد از اتمام موفقیت آمیزه بکاپ، میخواید یک سرویس مانیتورینگ رو مطلع کنید که همه چی اوکی بوده و میتونه لاگها رو آرشیو کنه. برای این کار با pingOnSuccess() میتونید به راحتی یک درخواست HTTP به سرویس مانیتورینگ بفرستید.
از طرفی اگه عملیات بکاپ fail شد، با pingOnFailure() میتونین سریع یک هشدار به تیمتون یا سرویس اعلان بفرستید تا موضوع بررسی بشه.
$schedule->command('backup:run')
->dailyAt('02:00')
->pingOnSuccess('https://your-monitoring-service.com/api/backup-success')
->pingOnFailure('https://your-alert-service.com/api/backup-failed');چرا مهمه؟
این قابلیت کمک میکنه workflow بین سرویسها به شکل اتوماتیک و مطمئن کنترل بشه و در صورت بروز خطا سریع واکنش داده بشه.
#Laravel #Laravel_tip #لاراول
@GoldenCodeir 🔥
(به منبع و مثالش دقت کنید👇🏾)
https://x.com/wendell_adriel/status/1979151691023810615?t=om0EwaeLVurWj05Rmxl5Tg&s=19
X (formerly Twitter)
Wendell Adriel (@wendell_adriel) on X
Laravel Tip 🚀
Did you know about the pingOnSuccess() and pingOnFailure() methods when scheduling tasks on Laravel? They are pretty handy in many situations!
In the example, after a nightly ETL completes, we can start a reindex job in another service by…
Did you know about the pingOnSuccess() and pingOnFailure() methods when scheduling tasks on Laravel? They are pretty handy in many situations!
In the example, after a nightly ETL completes, we can start a reindex job in another service by…
👍13🔥3
به گفته ی Taylor Otwell
نسخهای جدید از لاراول منتشر شد که دو ویژگی قدرتمند و کاربردی بهش اضافه شده:
📌 شماره ۱ : Cache Failover
یکی از چالشهای رایج در پروژههای بزرگ، خرابی کش (مثل Redis) است. در گذشته اگه کش از کار میفتاد، ممکن بود پروژه با خطا مواجه بشه و از کار بیفته.
حالا لاراول از cache failover پشتیبانی میکنه:
اگه کش اصلی در دسترس نباشه لاراول بصورت خودکار سراغ کش پشتیبان (مثل فایل یا دیتابیس) میره و از بروز خطا جلوگیری میکنه.
📌 شماره ۲: Deferred Queue
قابلیت دوم، نوع جدیدی از صف هست با نام deferred.
این صفها به شما اجازه میدن که اجرای job هارو تا زمانی خاص به تاخیر بندازید ، نه صرفا با delay زمانی، بلکه با منطق های انعطاف پذیرتر.
مثلا:
میتونید job ها رو در صف نگه دارید، ولی اجرای اونارو تا زمان فراهم بودن شرایط مشخصی (مثل آماده شدن یک ریسورس خارجی یا عبور از محدودیتها) به تعویق بندازین.
#Laravel #PHP #Laravel_tip #لاراول
@GoldenCodeir 🔥
داکیومنته لاراول:
https://laravel.com/docs/12.x/cache#cache-failover
(منبع👇🏾)
https://x.com/taylorotwell/status/1980664560492376378?t=AW_V157KGhHWfyPOqCy1Lg&s=35
نسخهای جدید از لاراول منتشر شد که دو ویژگی قدرتمند و کاربردی بهش اضافه شده:
📌 شماره ۱ : Cache Failover
یکی از چالشهای رایج در پروژههای بزرگ، خرابی کش (مثل Redis) است. در گذشته اگه کش از کار میفتاد، ممکن بود پروژه با خطا مواجه بشه و از کار بیفته.
حالا لاراول از cache failover پشتیبانی میکنه:
اگه کش اصلی در دسترس نباشه لاراول بصورت خودکار سراغ کش پشتیبان (مثل فایل یا دیتابیس) میره و از بروز خطا جلوگیری میکنه.
📌 شماره ۲: Deferred Queue
قابلیت دوم، نوع جدیدی از صف هست با نام deferred.
این صفها به شما اجازه میدن که اجرای job هارو تا زمانی خاص به تاخیر بندازید ، نه صرفا با delay زمانی، بلکه با منطق های انعطاف پذیرتر.
مثلا:
میتونید job ها رو در صف نگه دارید، ولی اجرای اونارو تا زمان فراهم بودن شرایط مشخصی (مثل آماده شدن یک ریسورس خارجی یا عبور از محدودیتها) به تعویق بندازین.
#Laravel #PHP #Laravel_tip #لاراول
@GoldenCodeir 🔥
داکیومنته لاراول:
https://laravel.com/docs/12.x/cache#cache-failover
(منبع👇🏾)
https://x.com/taylorotwell/status/1980664560492376378?t=AW_V157KGhHWfyPOqCy1Lg&s=35
X (formerly Twitter)
Taylor Otwell (@taylorotwell) on X
Today's Laravel release ships with cache failover support as well as a "deferred" queue. 🫧
Cache failover automatically tries a backup cache if your primary cache is down.
https://t.co/cdwKRiwZBP
Cache failover automatically tries a backup cache if your primary cache is down.
https://t.co/cdwKRiwZBP
👍11❤4
Golden Code
اصل open closed در اصول SOLID چی میگه؟ این اصل میگه که: کلاسها، ماژولها یا توابع باید برای توسعه باز باشند ولی برای تغییر بسته باشند. به عبارت دیگه، سیستم نرمافزاری باید به گونهای طراحی بشه که قابلیت افزودن ویژگیهای جدید بدون نیاز به تغییر در کدهای…
اصلLSP یکی از اصول مهم SOLID هستش که میگه:
"Objects of a subclass should be replaceable with objects of their superclass without affecting the correctness of the program."
این اصل تاکید داره که کلاسهای فرزند باید بهگونهای طراحی بشن که در صورت جایگزینی با کلاس والد، سیستم به درستی عمل کنه و هیچ مشکلی پیش نیاد.
چرا LSP مهمه ؟
1.تاثیر در پایداری کد
2. باعثه کاهش باگهای پروژه میشه
3. انعطافپذیری: با رعایت LSP میتونید به راحتی کلاسهای فرزند رو جایگزین کلاسهای والد کنید بدون اینکه نیاز به تغییرات زیادی در کد داشته باشین.
📌 نقض LSP و مشکلاتش
زمانیکه یک کلاس فرزند رفتار متفاوتی نسبت به کلاس والدش ارائه بده LSP نقض میشه. این خب میتونه باعث یک خطا بشه.
مثلا اگه یک کلاس فرزند ویژگیهایی رو به ارث ببره که براش مناسب نیست (مثل پرواز برای یک پنگوئن)، وقتی اون کلاس فرزند جایگزین کلاس والد بشه، ممکنه برنامه با خطا مواجه بشه.
✅️ راهحل: یه طراحیه صحیح
برای جلوگیری از نقض LSP باید کلاسها بهگونهای طراحی بشن که تنها ویژگیهای مرتبط رو ارث ببرند. مثلا، میشه رفتارهایی که به پرواز مربوط هستن رو در یک کلاس جداگانه قرار داد و رفتارهایی که به ویژگیهای دیگر مربوط میشن رو در کلاسهای دیگر مدیریت کرد.
این طراحی باعث میشه که هر کلاسه فرزند فقط ویژگیهای مرتبط با خودشو داشته باشه و امکان جایگزینی کلاسها بدون بروز مشکل وجود داشته باشه.
خلاصش که:
اصل LSP میگه که کلاسهای فرزند باید رفتار کلاس والد خودشونو بهدرستی حفظ کنند. این اصل باعث میشه که کد ما قابل توسعه، پایدار و بدون خطا باقی بمونه و از بروز مشکلات هنگام جایگزینی کلاسها جلوگیری بشه.
#SOLID #LSP
@GoldenCodeir 🔥
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-lsp-liskovabrsubstitution-activity-7387569961008943104-XDW2?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
"Objects of a subclass should be replaceable with objects of their superclass without affecting the correctness of the program."
این اصل تاکید داره که کلاسهای فرزند باید بهگونهای طراحی بشن که در صورت جایگزینی با کلاس والد، سیستم به درستی عمل کنه و هیچ مشکلی پیش نیاد.
چرا LSP مهمه ؟
1.تاثیر در پایداری کد
2. باعثه کاهش باگهای پروژه میشه
3. انعطافپذیری: با رعایت LSP میتونید به راحتی کلاسهای فرزند رو جایگزین کلاسهای والد کنید بدون اینکه نیاز به تغییرات زیادی در کد داشته باشین.
📌 نقض LSP و مشکلاتش
زمانیکه یک کلاس فرزند رفتار متفاوتی نسبت به کلاس والدش ارائه بده LSP نقض میشه. این خب میتونه باعث یک خطا بشه.
مثلا اگه یک کلاس فرزند ویژگیهایی رو به ارث ببره که براش مناسب نیست (مثل پرواز برای یک پنگوئن)، وقتی اون کلاس فرزند جایگزین کلاس والد بشه، ممکنه برنامه با خطا مواجه بشه.
✅️ راهحل: یه طراحیه صحیح
برای جلوگیری از نقض LSP باید کلاسها بهگونهای طراحی بشن که تنها ویژگیهای مرتبط رو ارث ببرند. مثلا، میشه رفتارهایی که به پرواز مربوط هستن رو در یک کلاس جداگانه قرار داد و رفتارهایی که به ویژگیهای دیگر مربوط میشن رو در کلاسهای دیگر مدیریت کرد.
این طراحی باعث میشه که هر کلاسه فرزند فقط ویژگیهای مرتبط با خودشو داشته باشه و امکان جایگزینی کلاسها بدون بروز مشکل وجود داشته باشه.
خلاصش که:
اصل LSP میگه که کلاسهای فرزند باید رفتار کلاس والد خودشونو بهدرستی حفظ کنند. این اصل باعث میشه که کد ما قابل توسعه، پایدار و بدون خطا باقی بمونه و از بروز مشکلات هنگام جایگزینی کلاسها جلوگیری بشه.
#SOLID #LSP
@GoldenCodeir 🔥
(منبع👇🏾)
https://www.linkedin.com/posts/ali-mohammadi-5b7375389_solid-lsp-liskovabrsubstitution-activity-7387569961008943104-XDW2?utm_source=share&utm_medium=member_android&rcm=ACoAAF-g0BsBHAA03jv74SJdJwUrgHFqATrvXb8
Linkedin
#solid #lsp #liskov_substitution | Ali Mohammadi
What is LSP?
The Liskov Substitution Principle states:
"Objects of a subclass should be replaceable with objects of their superclass without affecting the correctness of the program."
In other words, subclasses should not violate the rules or expectations…
The Liskov Substitution Principle states:
"Objects of a subclass should be replaceable with objects of their superclass without affecting the correctness of the program."
In other words, subclasses should not violate the rules or expectations…
👍7