アプリケーションサービスレイヤー - APIメソッドインターフェイスの書き方
-
28-09-2019 - |
質問
人々はどのようにサービスレイヤーインターフェイスを設計しますか?
私は大規模なWebアプリケーション(PHP)をプログラミングしており、MVCを使用しています。
public savePersonAction() {
$input = filter($_GET);
... input validation ...
$result = $this->_service->savePerson( ? );
... etc
}
サービスのSavePersonは、$入力構造またはコンテキスト全体(PHP、連想配列)の引数を取得する必要がありますか?
例:これ -
public function savePerson(array $input) {
または、すべての入力フィールドを分離し、「ハード」インターフェイスを提供する必要があります。
public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {
ありがとう。
ポール
解決
あなたがMVCスピリットに従うつもりならあなたのもの savePerson
メソッドは生の入力を受け入れないでください。 UIから来るデータの形式と直接結合するべきではありません。代わりに、「個人」オブジェクトのように、サービスドメインの条件で定義された入力を受け入れる必要があります。 (これは、Cobbyが提案したような連想配列である可能性があります)。 RAW入力をサービスに必要な形式にマッピングするのは、コントローラーのアクション方法の仕事です。
この追加の翻訳ステップの利点は、UIからサービス(モデル)を分離することです。別のUIを実装する場合、サービスインターフェイスを変更する必要はありません。新しいコントローラー(そしてもちろんビュー)を書くだけです。
あなたの例は好きです savePerson($title, $firstName, $lastName...)
正しいアイデアです。通常、2つまたは3つ以上の引数を持つ方法がある場合、それは悪い兆候です。関連する引数を何らかの高レベルのオブジェクトにグループ化できるはずです。
他のヒント
私のMVCアプリケーションは次のように構成されています:コントローラー - >サービス - > ORM/その他のライブラリ
質問に答えるために、通常、コントローラーでは、配列としてフォームデータ、つまり$ form-> getValues()または同様のものを取得します。メンテナビリティに関しては、アレイを除いて引数として配列を除いてサービスが最適です。そのようにして、フォームに別のフィールドを追加する場合、フォームとサービスを更新するだけで、コントローラーは触れられないままになります。
だから私はあなたの最初の例に行くと思います:
public function savePerson($personArray);
さらに、フォームライブラリは検証/フィルタリング/サニタイゼーションの処理を行うため、「ハード」インターフェイスは必要ないはずです。これにより、関連配列が有効であると仮定できます。
すべての入力フィールドを分離し、使用中の「ハード」インターフェイスを提供します。
public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}
そのクリーナーと必要な仮定はありません。