دوستان سلام.
من دارم یه اپلیکیشن restful api با لاراول می نویسم. تا حالا کار error handling رو برای برنامه های restful api انجام ندادم. میشه یه راهنمایی بکنید که چجوری انجام میشه این مسئله و چی کار کنیم که حرفه ای باشه؟
یه سری چیزا رو مطالعه کردم و یاد گرفتم. مثلا اینکه بعضی از اررورهای مربوط به خود لاراول رو توی متد render باز نویسی کردم. به این شکل:
if($request->wantsJson()){
$message = $exception->getMessage();
$code = $exception->getCode();
$status = 400;
switch ($exception){
case $exception instanceof NotFoundHttpException:
return response()->json(['message'=> "روت درخواستی شما وجود ندارد"],404);
break;
}
}
و بقیه رو هم اگه لازم باشه به همین شکل مدیریت می کنم تا اینجاش درسته ؟
حالا می خوام مثلا داخل کنترلرم یه چیزی رو چک کنم و بگم مثلا اگه user موجود نبود بیا خطا مثلا NotFoundHttpException رو برگردون و برای اینکار اومدم از try catch استفاده کردم:
try {
if(!$user){
throw new NotFoundHttpException();
}
} catch (Throwable $error) {
throw new $error;
}
حالا به نظرتون توی try catch درست عمل کردم. یعنی من توی catch فقط باید یه new $error رو برگردونم کافیه ؟ خودش میره از فایل exception خطا مورد نظر رو پیدا می کنه و return می کنه یا کار دیگه ای باید بکنم ؟
حالا یه سری خطاهای دیگه هم دارم که مخصوص پروژه خودم هستش و به لاراول مربوط نیست. مثلا کد تخفیف پیدا نشد! یا کد تخفیف توسط یوزر استفاده شده است ! اینارو باید چجوری مدیریت کنم ؟ چون می دونم توی دستورات لاراول php artisan make:exception وجود داره که فکر کنم یه فایل exception شخصی سازی شده برای پروژه میسازه که بتونم خطاهای خودم رو توش مدیریت کنم. از اون به چه شکلی باید استفاده کنم ؟
ممنون می شم راهنماییم کنید
یه مثال براتون میزنم:
فرض کنید یه کلاس Coupon داریم که یه متد validate داره..
وقتی این متد فراخوانده میشه این متد فرصت این رو داره که، اگر خطایی پیش اومد یه اکسپشن رو throw کنه:
Class Coupon {
public function validate() {
if ($coupon->hasExpired()) {
// coupon is not valid --> Throw an exception
throw new Exception('Coupon is not Valid');
}
// if coupon is valid --> return true;
return true
}
}
حالا وقتی که میخواهید از این کد استفاده کنید.. چون ممکنه درش اکسپشنی وجو داشته باشه » کد رو داخل try catch میذارید تا اگر خطایی بود بتونید مدیریتش کنید:
$coupon = new Coupon;
try {
if ($coupon->validate()) {
// continue
}
} catche (Exception $e) {
// handle exception in the proper way
}
ببینید exception ها راهی برای مدیریت خطاها هستند دیگه.. و میتونید ریسپانس های مختلف رو براشون برگردونید.
اگر API شما بزرگه میتونید کدهایی رو مشخص کنید مثلا ۶۸۷ برای موقعی که "کد تخفیف توسط یوزر استفاده شده است"
این کد رو با استاتوس کد اشتباه نگیرید (این موضوع در API توئیتر انجام شده)
شما توی یه API دو حالت کلی رو دارید
یا عملیات موفقیت آمیز بوده و شما یه پیام + استاتوس کد بر میگردونید
یا به هر دلیلی موفقیت آمیز نیست (پارامترها اشتباهند، دسترسی وجود نداره و ..) و پیام + استاتوس کد مورد نظرشو برمیگردونید
@ali.bayat
بعله درسته اینو تا حدودی متوجه شده بودم
فقط به صورت عملی بلد نیستم پیاده سازیش کنم.
الان به اون نحوی که من دارم داخل try catch ارور رو throw می کنم صحیحه ؟ به همین شیوه کار می کنن ؟
اون فایل جدید exepction رو چطور ؟ اگه ساختم و داخل اون یک سری اررور به یک سری status کد تعریف کردم و ریسپانسی که باید بده هرکدوم رو هم مشخص کردم. چطوری داخل try catch مثل بگم الان خطای 689 رخ داده که بره ریسپانس مربوط به همون 689 رو فراخوانی کنه از handler ام ؟
یه مثال براتون میزنم:
فرض کنید یه کلاس Coupon داریم که یه متد validate داره..
وقتی این متد فراخوانده میشه این متد فرصت این رو داره که، اگر خطایی پیش اومد یه اکسپشن رو throw کنه:
Class Coupon {
public function validate() {
if ($coupon->hasExpired()) {
// coupon is not valid --> Throw an exception
throw new Exception('Coupon is not Valid');
}
// if coupon is valid --> return true;
return true
}
}
حالا وقتی که میخواهید از این کد استفاده کنید.. چون ممکنه درش اکسپشنی وجو داشته باشه » کد رو داخل try catch میذارید تا اگر خطایی بود بتونید مدیریتش کنید:
$coupon = new Coupon;
try {
if ($coupon->validate()) {
// continue
}
} catche (Exception $e) {
// handle exception in the proper way
}
@ali.bayat
با توجه به پاسخ شما و یه مقدار سرچی که خودم انجام دادم تقریبا به یه راه حل خوب رسیدم که باید چه جوری اون چیزی که مد نظرم هست رو پیاده سازی کنم
متشکر
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟