###前提
Laravelを使用してwebアプリを作成しています。
恥ずかしながらいつもなんとなくでクラスやロジックの追加修正やなどを行っており、動作はするけどクラス構成やそのクラスの責務が微妙だなあと思うことがよく発生します。
そこで、この場合、みなさんならどう作るのか、もしくはどう作るべきかなどを教えてほしいです。
ただの好みや間違いの指摘でも構いませんので、色々聞ければと思います。
コード
決済を行う処理が有り、流れはだいたい下記の様になっています。
PHP
1class App\Http\Controllers\MyController 2{ 3// フォームからのPOST(決済実行)を受け付ける 4public function postCheckout(App\Http\Requests\MyRequest $req) 5{ 6 // リクエストの基本的なvalidateは実施済みのため、ここでのvalidateは不要 7 try { 8 // リクエストを基に、CheckoutのAPIに投げるデータを作成する 9 $data = $this->makeDataForCheckout($req); // <- (1) 10 // 決済用POSTデータで、決済を実行する 11 $result = $this->checkout($data); // <- (2) 12 if ($result->status !== 'succeeded') { 13 // 決済失敗してる 14 throw new Exception($result); 15 } 16 // 決済が完了した 17 return redirect('/checkout/complete'); 18 } catch (Exception $e) { 19 // 決済 20 Log::error($e); 21 } 22 23 // 決済失敗してる 24 return back()->withInput(); 25}
- リクエストを基に、CheckoutのAPIに投げるデータを作成する
- 決済用POSTデータで、決済を実行する
PHP
1 2// 1. リクエストを基に、CheckoutのAPIに投げるデータを作成する 3public function makeDataForCheckout(App\Http\Requests\MyRequest $req) 4{ 5 // 金額含む商品情報と、決済ユーザ情報を取得し返す 6 // 決済会社ごとに受け付けるフォーマットが違うため、考慮の必要有り 7 return [ 8 'item' => Item::find($req->item_id), 9 'user' => User::find($req->user_id), 10 ]; 11} 12 13// 2. 決済用POSTデータで、決済を実行する 14public function checkout(array $data) 15{ 16 // 例えばpaypal決済を実行する 17 // -> paypalクラスはただのラッパークラス 18 return $paypal->checkout($data); 19}
私が気になっているところですが、これらの1. 2.のメソッドをMyControllerクラスで持つべきなのか?という点です。
この場合、現状のままだと決済会社が増えるたびにコントローラが膨らんでいきます。
ただ決済会社を増やした場合、各会社ごと受け付けるデータが違うため、どこかしらでメソッドは増やす必要があります。
数バージョン考えてみました。良いと思える順です。
PHP
1 2// 1. データの変換は全てDataConverterクラスで行う 3// DataConverterは常にItemクラスとUserクラスに依存する 4$data = $paypalDataConverter->makeData($req); 5$result = $paypal->checkout($data); 6// -> 決済会社が増えた場合、DataConverterクラスと決済会社クラスの2つを作成する 7 8// 2. $reqをそのままPaypalクラスに渡してチェックアウトする 9// paypalクラスのcheckoutメソッド内で データ変換を行う($paypalDataConverter->makeData($req) などの形) 10$result = $paypal->checkout($req); 11 12// 3. Itemクラスで決済まで行う 13// paypalクラスやデータ変換クラスなどへの依存が生まれるので違和感 14$result = Item::paypalCheckout($req); 15
もやっとしていますが、どうするべきかご指南頂けますと幸甚です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/22 23:20