我有一个控制器,有一个处理预订的方法。这个方法变得越来越大,在开发了一些好的应用程序后,我意识到我做错了,因为我的许多控制器方法都很庞大而且很乱。
例如
function processBooking($id) {
// validate
// if validaton fails return errors
// if validation pass do the following
$booking = getDetailsFromRepository($id)
// check if client is paying with credits
// process booking with credits
// update client credids
// check if any errors with stripe and return readable message to user
// else process booking with credit card
// set all date for Stripe::charge
// capture charge
// check if any errors with stripe and return readable message to user
// if everything went well
// save payment in db
// save booking
// return success message to user
}
大多数步骤都是来自存储库类的函数。整个方法大约有300行。
经过一些研究后,我遇到了服务,所以我创建了一个ProcessBookingService.php类,我在其中查看所有ifs并检查多个函数,并将控制器方法减少到50行,这使得它清晰可读。 / p>
问题是,在旧方法上,我会根据出错的方式向用户返回不同的消息:卡被拒绝,点数不够等等。
由于大多数逻辑都发生在Service类中,在我需要将消息返回给用户的函数中,我设置了一个带有消息的变量并返回该消息。现在控制器获得了大量的ifs 例如:
$booking = $booking->process($data);
if($booking['success']) // redirect with success
else if($booking['card_declined']) // redirect with error
else if($booking['not_enough_points']) // redirect with error
else if($booking['stripe_request_error']) // redirect with error
else // unknown error on the server redirect with error
从设计和编程的角度来看,这是正确的吗?任何其他建议将不胜感激。
由于
答案 0 :(得分:2)
您可以使用例外来彻底解决问题。它可以很简单:
try
{
$bookingService->book($data);
}
catch(BookingException $e)
{
// redirect as error, possibly using $e->getMessage()
}
// redirect as success
如果要重定向到其他位置,可能需要具有异常层次结构。如果您使用语言字符串进行本地化,则可以使用重定向中的错误代码:
redirect('error_page', ['code' => $e->getCode()]);
将其转换为类似example.com/book/error?code=1234
的内容,然后使用代码显示正确的本地化消息。