2011-09-02 7 views
6

私はモデルレイヤーのセッション変数にアクセスするこのアプリケーションを開発中です。これはちょうど間違っているようですが、間違っていることが分かります。多分間違っていないかもしれませんが、アプリケーションのほとんどの場所では、セッション変数はコントローラで処理され、引数として渡されますが、他の場所ではセッション値にアクセスするだけです。これは悪い習慣のようだと私は間違っていますか?Zend Frameworkアプリケーションデザイン - モデルレイヤーでセッション変数にアクセスする必要があります

編集: 私はモデルのセッションが好きではないという理由の1つは、テストするのがより複雑に思えるということです。関数に渡されたパラメータだけを保持し、その後渡されたレコードセットを保持します。

thx

+4

モデルをコマンドラインスクリプトで使用したいと考えてください。セッションはありません。または単体テストで。セッションから来る可能性のあるデータが必要な場合は、テストやコマンドラインの使用の際に疑似できるオブジェクトの中に隠す方がよいでしょう。 –

+0

そんなことしないでください!データレイヤーはビジネスロジックの別のものです。 Zend_Registryインストゥルメントまたはデータマッパを使用してください。 –

答えて

4

です。

私はこの考え方は、次のとおりです。

  1. モデルは、データ層を表します。
  2. ほとんどの場合、データ層はDBベースになります。
  3. セッションは単なる別のデータ記憶媒体です。
  4. 結論:あなたのモデルが表すデータがセッションに格納されている場合、それはOKであるよりも、モデル

例の中からそのデータにアクセスするには、セッションベースのショッピングカートです。私のカートのオブジェクトは私のセッションデータのモデルです。

+0

十分に公正です。しかし、私はまだセッションオブジェクトのgetter/setterを追加するので、後で試してみることができます。 –

+0

私はこのアプリ(と元のモチベーション)で見ている問題は#3は#2ではなく、よりcohrerently、データベースとPHPのセッションメカニズムにのみ永続化されていないということです。実際にはあなたはぶら下がっている参照を取得しています。この場合、sess-> user_id変数(つまりarコントローラレベルの終了)がないかぎり、これらの特定のメソッドが呼び出されないようにするか、モデルコンストラクタ/初期化を介してユーザーを管理するかsess-> user_idを持っています。テストとcli(両方とも使用されています)の問題に関しては、私は手動のsess値を作成することができました。 – timpone

+0

@timponeたぶん私はあなたが参照をぶら下げて何を意味するのか分かりません。不安定な参照の問題は、別の永続モデル内でセッションIDを外部参照として格納した場合にのみ発生します。これは、ストレージ/データベース設計上の問題です。たとえ両方がデータレイヤーであっても、永続的なストレージ(データベース)と一時的なストレージ(セッション)は関係ありません。私の応答が示した意味は、一時記憶域がデータをモデル化するために使用されていた場合、モデル内のセッションを参照するものが受け入れられる場合があります。 –

2

コントローラshd内にそのセッションを使用するモデルを使用する前に、チェックウェザーセッションが存在するかどうかを確認します。

+0

私はこれを見ましたが、他のモデルを持つモデルの問題にぶつかります。別のモデルで使用されているモデルでセッション変数が使用されている場合はどうなりますか?コントローラーに何が実際にあるべきかを管理するために、コントローラーに多くのコードを書くようなものです。あなたに反対するよりも大声で考えてください。 – timpone

+0

@timponeセッションをパラメータとしてモデルに渡すときには、コントローラ内のすべてのチェックを行う必要があります。コントローラの仕事は、モデルの中に入るロジックを制御することです。 –

+0

+1モデルでセッションを確認する必要はありませんが、これはプラグインの仕事です。おそらく、あなたのアーキテクチャに何か不足しているでしょう。そうでなければ、これはZend_Registryジョブです。 –

0

セッション変数には何が格納されていますか?単にログインしているのであれば? Y/N 'の場合、おそらくモデルレイヤの一部である必要はありません。しかし、それよりも複雑な場合は、ビジネスモデルと密接に関連している可能性があり、そのように扱う必要があります。

Zend Testのドキュメントの下部にある例は、ログイン機能を使用して完全なMVCをテストする方法を示しています。おそらく、モデルをテストするときに同じことをすることができますか?

+0

それを指摘するためのthx;私はそれが依存すると思うすべてのもののように。複雑なアプリでは、災害のレシピのようです。一般的に、私はいつもデータのいくつかのcli処理をして、それをスクラブしたり、実際のセッション変数を持って複雑にしたりしたいと思っています。それはできますか?はいそれはすべきでしょうか?わからない – timpone

0

いいえ、いけません。ストレージの種類は、ビジネスロジックとは別にしてください。例:

私はアクセスチェックを実行し、ユーザオブジェクトをレジストリに置く簡単なプラグインを1つ持っています。したがって、アクセスセッションの代わりに、モデルは明確に定義されているレジストリにアクセスできます。

$User = Zend_Registry::get('User'); // User model object

理論的な観点から、すべてがデータマッパーを介してアクセスする必要があります。将来、セッションストレージから別のものに変更する場合は、1か所で更新する必要があります。あなたのモデルは、データがどこから来たのかを知る必要はありません。

データを取得するために複数のパスを使用している場合は、アプリケーションが大きくなると問題が発生する可能性があります。

OOPとレイヤードシステムアプローチは、特殊なオブジェクトとレイヤーを作成し、特定のアクションをコード全体に広げないように単純なものにすることを提案しています。

ただし、利点がない限り、変更する必要はありません。 リファクタリングがすべてを予測しようとするより効率的であることに注意してください。

関連する問題