5

約20個のPOSTパラメータを処理する必要がありますが、どこで処理すればよいかわかりません。

それぞれをモデル上のメソッドの引数として定義し、メソッドが呼び出されたときにコントローラーからそれらを渡すことができます。これにより、かなりの作業が発生し、引数の数が原因で関数呼び出しが読みにくくなります。

または、モデルのメソッドを呼び出して、パラメーターに直接アクセスすることもできます。

パラメータを引数として渡すと、関数がアクセスするパラメータをより細かく制御でき、ドキュメントはよりわかりやすくなります。ただし、後で新しいパラメーターを追加した場合は、既存のすべての呼び出しを中断しないように、メソッド呼び出しの最後にパラメーターを追加する必要があります。引数を論理的にグループ化できないため、これが数回発生すると非常に混乱するだろうと思います。

モデル内のパラメーターにアクセスする場合、コントローラーからモデルにパラメーターを渡す必要がないため、メソッドはterserを呼び出します。ただし、アクセスされるパラメーターは簡単に制限なしで追加または削除できるため、私はパラメーターを制御できません。これには他の開発者からのより大きな規律が必要であり、遅かれ早かれ誰かが「これを本当に素早く(追加|変更|修正)する」ことに縛られているので、私はそれに依存するのは嫌です。

どちらに行けばいいのかわかりません。私はモデルですべてを行う傾向があります。これは、記述が速く、保守が容易であり(引数の混乱がない)、概念的にはモデルのビューによりよく適合するためです。一方、モデルの見方が正しいかどうかはわかりません。他の開発者に変更のたびに常にドキュメントを更新するように頼ると、モデルが混乱してしまうかどうかはわかりません。

だから、私は何をすべきですか?

4

5 に答える 5

1

さて、なぜモデルのそのメソッドのパラメーターとして(連想)配列を受け入れて、それを$ _POST配列全体に渡すことができないのですか?少なくとも私の意見では、カプセル化を壊すことはありません。

編集:そのために連想配列を使用したくない場合は、いわゆる「プレーンオールドオブジェクト」(Cの構造体のようにデータを運ぶためだけに使用されるオブジェクト)を使用することもできます。たとえば、これに送信された登録フォームの保存が含まれる場合:

class UserData
{
    protected $name;
    protected $username;
    protected $password;

    public function getName() { /* <...> */ }
    public function setName() { /* <...> */ }
    /* other accessors go here */
}

class UserController extends Controller
{
    public function register()
    {
        $userData = UserData::create()
            ->setName($_POST['name'])
            ->setUsername($_POST['username'])
            ->setPassword($_POST['password']);
        Users::add($userData);
    }
}

これにより、Users :: addで厳密な入力を使用できるようになり、ドキュメントの処理も簡単になります。

于 2009-08-18T12:15:44.497 に答える
1

私はこれと同じ問題に苦労しました。私が思いついた解決策は柔軟性があり、コードを再利用可能に保ち、フロントエンドへの変更に寛容です。私はセッターを使用するのが好きです。もちろん、すべての値にセッターを設定するのは面倒なので、データを論理的な方法でグループ化すると次のようになります。

$ user = new User();
$ user-> setName($ _ POST ['lastName']、$ _ POST ['firstName']);
$ user-> setAddress($ _ POST ['address1']、$ _ POST ['address2']、$ _ POST ['city']、$ _ POST ['state']、$ _ POST ['zip']);

あなたはポイントを取得します。オブジェクト変数に保存されると、これらの値をオブジェクトのすべてのメソッドで使用できます。

モデルをスーパーグローバルに依存させることは非常に柔軟性がありません。また、ユニットテストが面倒になります。

于 2009-08-18T13:38:45.533 に答える
0

少し前に同様の質問に答えました。たとえば、連想配列として既に提案されているように、それらを渡す必要があります(以前にすべてのセキュリティチェックを行います)。そうすれば、クラスを簡単に再利用できます。

于 2009-08-18T12:19:05.590 に答える
0

コントローラ。リクエストデータとモデル操作は同じものではないためです。したがって、モデルにリクエストデータベースのロジックを配置することは、他のすべての可能なリクエストに必要であり、それは悪いことです

于 2009-08-18T13:29:08.037 に答える