クラスには、使用可能な post/get 変数に基づいてアクションを実行する処理メソッドがあります。簡単な例を次に示します。
public function handleAll(array $vars) {
if (isset($vars['var1'])) {
$this->doThisAction($vars['var1']);
} else if (isset($vars['var2'])) {
$this->doAnotherAction($vars['var2']);
}
}
したがって、実行時にメソッドをこのように呼び出すことができます$handler->handleAll($_POST)
。問題は、$vars 配列に格納されている変数の名前を「var1」および「var2」などにする必要があることです。これは、処理コードが html フォーム要素の名前または URL の get 変数 (または実際にはのキー) と結合されていることを意味します。渡された任意の配列)。
任意の変数の配列を注入できるようにすると、メソッドが柔軟になります。これは、ポリモーフィックでもあるため必要です。クラスはこのメソッドを継承し、それを使用して独自のアクションを呼び出します。この結果、処理方法が機能するために何が必要かが外部からは明らかではありません。これは、実装を調べて、それが何をするかを調べる必要があることを意味します (愚かなコードを phpdoc にコピーしない限り)。
これを回避する方法がわかりません。(このような複数のクラスからの) インデックス ページに膨大な if/case ステートメントがすべて公開されていると、非常に厄介なコードになるため、これらすべてをメソッド内にカプセル化することをお勧めします。また、自身の状態を操作するアクションの呼び出しを担当するクラスのメソッドとして持つことも理にかなっています (責任駆動設計)。各変数をメソッドのパラメーターとして使用することを考えましたが、一部のクラスではパラメーター リストが非常に大きくなります。また、さまざまなクラスの多くの handleAll() メソッドを自動的に呼び出すことができないことを意味します。これは、呼び出しごとにすべてのパラメーターを明示的に注入する必要があり、ポリモーフィックな側面が取り除かれるからです。
要約すると、メソッドをポリモーフィックに保つ必要がありますが、HTML フォームまたは URL からのユーザー入力から処理コードを分離する何らかの方法が必要です。これを行う際に、インターフェイスを実装から分離する方法もあるかもしれません。これに対する解決策がまだ見つからないことに驚いています。これは一般的な問題のようです。