0

私はCodeignitor2.xを使用しており、元々はコントローラーをモジュールとして使用していました(完全にHMVCではありません)。他の下位レベルのコントローラーを呼び出すトップレベルのコントローラーがありました。私の考えでは、これらの下位レベルのコントローラーはまだビューと対話しているため、モデルやドライバーではなくコントローラーのままにする必要があります。

ただし、私が見つけたのは、コントローラーの各インスタンスがCIの新しいインスタンスも生成することです。したがって、リクエストごとに3つまたは4つのCIインスタンスを実行します。大量のオーバーヘッドが発生し、セッションの問題も発生しました。

それ以来、これらの下位レベルのコントローラーをドライバーとしてライブラリに移動しました。これで、constructメソッドでCIインスタンスをキャプチャし、それに変更を加えます。これにより、作業が非常に便利になり、HMVC拡張機能は必要ありません。ドライバーは外部からも呼び出せないので、特定のエントリーポイントを介してすべてのリクエストを集めることができます。

私の質問は、これが構造的に正しいかどうかです。 私は常に、ドライバーはメソッド呼び出しを通じて提供されたデータのみを変更する必要があるという考えを持っていましたが、これらのドライバーの多くはGETとPOSTから直接情報を取得し、ビューに直接追加することはありませんが、頻繁にアクセスしますファイルを表示し、処理されたビューをCIインスタンスに渡して出力します。

[編集]もう少しコンテキスト: 私が作成したドライバーの1つは、基本的に「アクセス」と呼ばれるユーザーログインドライバーです。create / login/logoutメソッドの「User」モデルを呼び出します。ドライバーはPOSTデータを使用してユーザーモデルをチェックし、エラーや必要なものを含む正しいビューをロードします。このアイデアは、2行で、プロジェクト全体の任意のコントローラーにこのドライバーを含めることができるため、コードの冗長性が大幅に低下します。繰り返しになりますが、ドライバーはスコープに限定する必要があることはわかっていますが、ドライバーはスコープ外のものを変更せず、作成したビューを返すだけです。

ストレートMVCとよりインラインでこれを行うための別の方法はありますか?

4

1 に答える 1

0

それが正しいか間違っているかは言えません。しかし、私があなたなら、私はそれをしません。私はおそらくコードのいくつかをリファクタリングするでしょう。$_GETまたは$_POSTスーパーグローバルから直接データを取得して操作しないようにします。代わりに、いくつかのデータを引数として関数呼び出しに渡します。GETこれにより、またはPOSTリクエストをシミュレートする必要がないため、テストが容易になります。技術的には、コードから手動でスーパーグローバルの値を設定することもできますが、そうすることはお勧めしません。特に後で実行されるテストケースを作成する場合は、引数としてデータを提供する方がはるかに優れています。さらに、ライブラリがそれ自体を超えてスコープと相互作用することで、いくつかの隠れた落とし穴が生じる可能性があります。

私の意見では、ライブラリはモジュールのようなものであり、ドラッグアンドドロップするだけで、面倒なことなく使用できます。$_GETコードが本当にまたはから値を取得または操作する必要がある場合$_POSTは、代わりにモデルを使用することを意図している可能性があります。また、コードが実際にライブラリであるかどうかを検討することもできます。このコードはこのアプリケーションの外部で役立ちますか?それとも、依存度が高く、この特定のアプリにのみ役立つ可能性がありますか?後者に「はい」と答えた場合、それはおそらくライブラリではなくモデルであるはずです。最後に、ビューはコントローラーに任せる必要があります。ライブラリ/モデルメソッドから必要なデータを返し、それをコントローラーからビューに渡すだけです。

于 2012-09-28T15:12:38.050 に答える