我正在构建一个网络应用,客户可以在其中购买许多不同的计划,并且我使用Stripe API进行付款。当客户想要购买计划时,它必须填写信用卡详细信息和电子邮件。所以,我在 RegistrationController 中获取了所有这些表单数据。
问题是,我必须在post方法中做很多事情,如:
由于我必须执行许多步骤,因此我决定使用Try& Catch块并创建自定义异常,因此,如果某些内容失败,我将能够跟踪错误发生的位置。问题是我在RegistrationController中以一个混乱的方法结束:
public function postRegistration(RegistrationRequest $request,
StripeCostumer $stripeCustomer,
StripeSubscription $stripeSubscription)
{
if ($request['training_plan'])
{
if ( ! $this->PlanExists($request['training_plan']))
{
\Log::alert('Somebody tried to hack the plan: '.
$request['email']);
return response()->json(
['error' => \Config::get('variables.104')],
Response::HTTP_NOT_FOUND);
}
}
try
{
$response = $stripeCustomer->createNewStripeCostumer($request);
$plans = $stripeSubscription->createNewStripeSubscription($response->id, $request);
$user = $this->userRepo->create($request->all());
$user->syncUserPlans($plans);
$this->userRepo->saveStripeInfo($user,$response);
}
catch(StripeCustomerNotCreated $e)
{
\Log::error('Couldn't create a new Stripe Costumer: '.
$request['email']);
return response()->json(
['error' => \Config::get('variables.106')],
Response::HTTP_PAYMENT_REQUIRED);
}
catch(StripeSubscriptionNotCreated $e)
...
catch(EloquentUserNotCreated $e)
...
catch(StripeInfoNotSaved $e)
...
event(new UserRegistration($user));
\Auth::login($user);
return redirect('/');
}
我没有写过每个Catch块(我目前有4-5),但每次抛出异常时,我都要:
这是服务类管理Stripe客户的方法示例:
public function createNewStripeCustomer($request)
{
$response = Customer::create(array(
"description" => "Customer for test@example.com",
"source" => $request->stripeToken,
"email" => $request->email,
));
if(true)
{
return $response;
}
throw new StripeCustomerNotCreated();
}
*如果出现任何错误,我会返回类似API的JSON。
*我有" variables.php"文件在/ Config目录中保存所有错误消息。
我试图在Handler.php文件中保存每个Exception的逻辑(使用开关循环),但它并没有像我期望的那样工作。其他选项是替换许多if& else或嵌套的try& catch块的try& catch块,但它仍然很混乱。
使这项工作有效的最佳方法是什么?