Laravel控制器方法变得凌乱

时间:2015-07-18 09:54:57

标签: php laravel design-patterns

我有一个控制器,有一个处理预订的方法。这个方法变得越来越大,在开发了一些好的应用程序后,我意识到我做错了,因为我的许多控制器方法都很庞大而且很乱。

例如

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

从设计和编程的角度来看,这是正确的吗?任何其他建议将不胜感激。

由于

1 个答案:

答案 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的内容,然后使用代码显示正确的本地化消息。

相关问题