تسلط بر منطق شرطی در لاراول با روشهای «when()» و «unless()»: مثالهای واقعی

لاراول یک فریمورک قدرتمند PHP است که به دلیل نحو زیبا و ویژگی های قوی خود شناخته شده است. یکی از این ویژگیهایی که در لاراول 11.35.0 معرفی شده است when()
و unless()
روش ها، بخشی از Conditionable
صفت این روشها روشی خواناتر و کارآمدتر برای مدیریت منطق شرطی ارائه میکنند و قابلیت نگهداری کد شما را بهبود میبخشند. در این مقاله، نحوه استفاده از این روشها در سناریوهای واقعی را بررسی میکنیم و نشان میدهیم که چگونه میتوانند منطق شرطی پیچیده را در برنامههای لاراول ساده کنند.
1. تخصیص نقش پویا بر اساس ورودی کاربر
تصور کنید در حال ساخت یک فرم ثبت نام کاربر هستید که در آن کاربر نقشی را انتخاب می کند. بسته به نقش، می خواهید پس از ایجاد کاربر، مجوزها یا اقدامات مختلفی را اختصاص دهید.
بدون when()
:
if ($request->has('role')) {
$user->assignRole($request->input('role'));
}
با when()
:
$user->when($request->has('role'), function ($user) use ($request) {
$user->assignRole($request->input('role'));
});
در این حالت فقط در صورتی نقشی را اختصاص می دهیم که ورودی نقش موجود باشد. را when()
متد آن را مختصر می کند و بلوک کد فقط زمانی اجرا می شود که شرط درست باشد.
2. قوانین اعتبارسنجی پویا
فرض کنید در حال ساختن فرمی هستید که در آن فیلدهای خاص فقط در صورت رعایت یک شرط خاص باید اعتبارسنجی شوند. به عنوان مثال، فیلد ایمیل تنها در صورتی باید مورد نیاز باشد که کاربر گزینه “خبرنامه” را انتخاب کند.
بدون when()
:
$rules = [
'email' => 'nullable',
];
if ($request->has('newsletter')) {
$rules['email'] = 'required|email';
}
$request->validate($rules);
با when()
:
$request->when($request->has('newsletter'), function () use ($request) {
$request->validate([
'email' => 'required|email',
]);
});
این روشی تمیزتر و خواناتر برای اعمال منطق اعتبارسنجی شرطی با استفاده از آن است when()
.
3. ادغام داده های مشروط برای عملیات خاص
در یک پلتفرم تجارت الکترونیک، ممکن است بخواهید فقط در صورت ارائه کد کوپن خاص، تخفیف اعمال کنید. بیایید داده های تخفیف را به صورت پویا بر اساس وجود کوپن ادغام کنیم.
بدون when()
:
$data = [
'total_price' => $cart->totalPrice(),
];
if ($request->has('coupon_code')) {
$coupon = Coupon::where('code', $request->input('coupon_code'))->first();
if ($coupon) {
$data['discount'] = $coupon->discount_amount;
}
}
return response()->json($data);
با when()
:
$data = [
'total_price' => $cart->totalPrice(),
];
$data = $data->when($request->has('coupon_code'), function ($data) use ($request) {
$coupon = Coupon::where('code', $request->input('coupon_code'))->first();
if ($coupon) {
$data['discount'] = $coupon->discount_amount;
}
return $data;
});
return response()->json($data);
در اینجا، ما یک تخفیف مشروط بر اساس کد کوپن را به روشی ساده تر و زنجیره ای اعمال می کنیم.
4. ساده کردن منطق شرطی برای وضعیت کاربر
فرض کنید سیستمی دارید که میخواهید بسته به فعال یا غیرفعال بودن کاربر، پیام متفاوتی ارسال کنید.
بدون unless()
:
if (!$user->isActive()) {
return "Your account is inactive. Please contact support.";
} else {
return "Welcome back!";
}
با unless()
:
return $user->unless($user->isActive(), function () {
return "Your account is inactive. Please contact support.";
})->otherwise(function () {
return "Welcome back!";
});
با استفاده از unless()
در اینجا به متراکم کردن منطق شرطی در یک عبارت بازگشتی کمک میکند.
5. ترکیب کردن when()
و unless()
برای جریان های پیچیده
همچنین می توانید ترکیب کنید when()
و unless()
برای جریان های مشروط پیچیده تر. به عنوان مثال، مدیریت انواع مختلف کاربران (ادمین، مهمان و غیره) و نمایش محتوای خاص به آنها.
$variable->when($user->isAdmin(), function ($variable) {
return $variable->adminDashboard();
})->unless($user->isAdmin(), function ($variable) {
return $variable->guestDashboard();
});
6. یکپارچه سازی درگاه پرداخت بر اساس روش پرداخت کاربر
تصور کنید در حال پیاده سازی یک سیستم پرداخت هستید که در آن روش پرداخت انتخاب شده توسط کاربر، جریان اجرا را تعیین می کند، مانند استفاده از کارت اعتباری، پی پال یا بیت کوین.
بدون when()
:
if ($request->input('payment_method') == 'credit_card') {
// Handle credit card payment logic
} elseif ($request->input('payment_method') == 'paypal') {
// Handle PayPal payment logic
} elseif ($request->input('payment_method') == 'bitcoin') {
// Handle Bitcoin payment logic
}
با when()
:
$request->when($request->input('payment_method') == 'credit_card', function () {
// Handle credit card payment logic
})->when($request->input('payment_method') == 'paypal', function () {
// Handle PayPal payment logic
})->when($request->input('payment_method') == 'bitcoin', function () {
// Handle Bitcoin payment logic
});
این کار نحوه پرداخت شما را خواناتر می کند و منطق شرطی انتخاب روش پرداخت را ساده می کند.
7. محاسبه قیمت املاک و مستغلات با تخفیف
برای یک برنامه املاک و مستغلات، اگر کاربر برای اولین بار خریدار است یا از یک کد تبلیغاتی ویژه استفاده می کند، ممکن است تخفیفی برای قیمت ملک اعمال کنید.
بدون when()
:
$price = $property->price;
if ($request->has('first_time_buyer')) {
$price -= 5000; // Discount for first-time buyers
}
if ($request->has('promo_code')) {
$promo = PromoCode::where('code', $request->input('promo_code'))->first();
if ($promo) {
$price -= $promo->discount;
}
}
return response()->json(['price' => $price]);
با when()
:
$price = $property->price;
$price = $price->when($request->has('first_time_buyer'), function ($price) {
return $price - 5000; // Discount for first-time buyers
});
$price = $price->when($request->has('promo_code'), function ($price) use ($request) {
$promo = PromoCode::where('code', $request->input('promo_code'))->first();
return $promo ? $price - $promo->discount : $price;
});
return response()->json(['price' => $price]);
به این ترتیب کد محاسبه قیمت تمیزتر و نگهداری راحت تر می شود.
8. قرار ملاقات های پزشکی با تأیید بیمه
در یک برنامه پزشکی، پرداخت قرار ملاقات ممکن است به بیمه بودن کاربر بستگی داشته باشد و در صورت ارائه، ممکن است لازم باشد آن را تأیید کنید.
بدون when()
:
$payment = $appointment->cost;
if ($request->has('insurance_provider')) {
$insurance = Insurance::where('provider', $request->input('insurance_provider'))->first();
if ($insurance) {
$payment -= $insurance->coverage;
}
}
return response()->json(['payment' => $payment]);
با when()
:
$payment = $appointment->cost;
$payment = $payment->when($request->has('insurance_provider'), function ($payment) use ($request) {
$insurance = Insurance::where('provider', $request->input('insurance_provider'))->first();
return $insurance ? $payment - $insurance->coverage : $payment;
});
return response()->json(['payment' => $payment]);
این رویکرد بررسی پوشش بیمه ای را ساده می کند و به هم ریختگی را کاهش می دهد.
9. تعدیل قیمت بیت کوین بر اساس شرایط بازار
تصور کنید در حال ساخت اپلیکیشنی هستید که به کاربران امکان خرید بیت کوین را می دهد و قیمت آن بر اساس شرایط بازار در نوسان است. اگر بازار بی ثبات است، ممکن است بخواهید یک کارمزد به قیمت اضافه کنید.
بدون when()
:
$price = $bitcoin->currentPrice();
if ($market->isVolatile()) {
$price += 100; // Add a volatility fee
}
return response()->json(['price' => $price]);
با when()
:
$price = $bitcoin->currentPrice();
$price = $price->when($market->isVolatile(), function ($price) {
return $price + 100; // Add a volatility fee
});
return response()->json(['price' => $price]);
این منطق اعمال هزینه بر اساس نوسانات بازار را ساده می کند.
10. در دسترس بودن محصول مشروط در فروشگاه تجارت الکترونیکی
فرض کنید در حال ساخت یک پلتفرم تجارت الکترونیک هستید که در آن محصولات فقط در مناطق خاصی قابل حمل هستند. میخواهید بررسی کنید که آیا محصول برای مکان مشتری موجود است یا خیر.
بدون when()
:
$shippingFee = 0;
if ($customer->location == 'international') {
$shippingFee = $product->internationalShippingFee();
} else {
$shippingFee = $product->domesticShippingFee();
}
return response()->json(['shipping_fee' => $shippingFee]);
با when()
:
$shippingFee = $product->domesticShippingFee();
$shippingFee = $shippingFee->when($customer->location == 'international', function ($shippingFee) use ($product) {
return $product->internationalShippingFee();
});
return response()->json(['shipping_fee' => $shippingFee]);
را when()
این روش منطق مشروط را برای تعیین هزینه های حمل و نقل بر اساس موقعیت مکانی مشتری ساده می کند.
11. طرح درمان پزشکی بر اساس شرایط سلامت بیمار
یک برنامه مراقبت های بهداشتی را در نظر بگیرید که یک برنامه درمانی را بر اساس شرایط بهداشتی تشخیص داده شده بیمار تعیین می کند. اگر بیمار یک بیماری مزمن داشته باشد، ممکن است یک برنامه درمانی طولانی مدت پیشنهاد شود.
بدون when()
:
$treatmentPlan = 'Standard Plan';
if ($patient->hasChronicCondition()) {
$treatmentPlan = 'Chronic Care Plan';
}
return response()->json(['treatment_plan' => $treatmentPlan]);
با when()
:
$treatmentPlan = 'Standard Plan';
$treatmentPlan = $treatmentPlan->when($patient->hasChronicCondition(), function ($treatmentPlan) {
return 'Chronic Care Plan';
});
return response()->json(['treatment_plan' => $treatmentPlan]);
این رویکرد به سادهسازی منطق تصمیمگیری کمک میکند و مدیریت شرایط بیشتر را در آینده آسانتر میکند.
این مثال ها نشان می دهد که چگونه when()
و unless()
روشها را میتوان در حوزههای مختلفی مانند پرداخت، بیتکوین، املاک و مراقبتهای بهداشتی اعمال کرد و کد لاراول شما را خوانا، قابل نگهداری و زیباتر میکند. با پذیرش این روش ها، می توانید کدهای پاک تری بنویسید و قابلیت نگهداری برنامه های لاراول خود را افزایش دهید.