最良のオプションは、いくつかの変更を加えた#2のアプローチを使用することです。
私はそれを次のように書きます:
public function postLogin( $request )
{
$service = $this->serviceFactory->build('Recognition');
$service->authenticate( $request->getParam('username'),
$request->getParam('password') );
}
// Yes, that's the whole method
Request
インスタンスのようなものを使用してユーザーの入力を抽象化した場合は、実際に変数を作成する必要はありません。
また、Request::getParam()
メソッドを次のようなものに置き換えることもできますが、正しく構造化されたアプリケーションでは、パラメータとパラメータが同じ名前を共有すべきではないRequest::getPost()
という結論に達しました。GET
POST
コード スニペットに表示されるのserviceFactory
は、コントローラーとビュー インスタンスの両方に挿入するオブジェクトです。コントローラーとビューの間で同じサービス インスタンスを共有できます。
サービス の作成を担当します(アプリケーション ロジックを含み、ドメイン ビジネス ロジックはドメイン オブジェクトに残します)。これにより、ドメイン エンティティとストレージ抽象化の間の相互作用をプレゼンテーション レイヤーから分離することができます。
その他のオプションについて:
-
コントローラーはモデルのみを呼び出し、モデルは $_POST データを処理します。
MVC および MVC にインスパイアされたデザイン パターンでは、モデルはユーザー インターフェイスもプレゼンテーション レイヤーも全体として認識する必要はありません。PHPの$_POST
変数はスーパーグローバルです。
モデル レイヤーで使用すると、コードは Web インターフェースや特定のリクエスト メソッドにさえバインドされます。
-
コントローラは $_POST データをモデルのオブジェクトに変換し、そのオブジェクトをモデルに渡すだけです
あなたがこれで何を意味したのか完全にはわかりません。ユーザーのリクエストを含む抽象化のインスタンス化について話していたようです。ただし、この場合、コントローラーは、 SRPに違反する上記の構造のインスタンス化/作成を担当します。
結びのメモ:
理解しなければならないことの 1 つは、Web ベースの MVC アプリケーションのコンテキストでは、アプリケーションのユーザーはブラウザーであるということです。あなたじゃない。ブラウザはリクエストを送信します。リクエストはルーティング メカニズムによって処理され、コントローラによって配布されます。そして、ビューはブラウザへの応答を生成します。
もう 1 つは、モデルはクラスでもオブジェクトでもありません。モデルはレイヤーです。
アップデート
通常、ブラウザ、Web サービス、オフライン アプリケーションなどからのリクエストは同じコントローラで処理されますか、それともそれぞれに独自のコントローラがありますか?
すべての形式のアプリケーションを処理する単一のコントローラーを持つことができるはずです。ただし、これは条件付きであり、実際には 3 つのユースケースすべてで同じアプリケーションを使用しています。
そのためには、次の 2 つの条件があります。
Request
コントローラーが受け取るインスタンスを抽象化する必要があります
- ビューはコントローラの外部でインスタンス化する必要があります
このようにして、1 つのアプリケーションですべての要件を満たすことができます。各バリアントが異なる唯一のものは、Request
インスタンスを作成して適切なビューを選択するブートストラップ段階です。
あなたが説明した状況では、RESTまたはSOAPサービスは通常のWebアプリケーションとは異なる応答を生成することが期待されるため、変更部分は実際にはビューになります。