2017-09-25 13 views
2
$form = new Form(); 
return $form->addHiddenElement('somename', 'value') 
    ->addTextInputElement('someothername', 'value') 
    ->generate(); 

私は単純なフォームジェネレータを使用しています。関数のオブジェクトチェーンをPHPで動的に呼び出すには?

これはconfigで行うことができますか?たとえば、単純なPHP配列ですか?

私は約について知っています:http://php.net/manual/en/function.call-user-func-array.phpと他の同様の機能。しかし、中に私たちは、この配列のために、次...

へのparamsの未知の数量及び各必須鎖と機能、各未知の数量を持っている上に、潜在的

return [ 
    'addHiddenElement' => [ 
     'somename', 'value' 
    ], 
    'addTextInputElement' => [ 
     'someothername', 'value' 
    ] 
] 

はこの..です正確にマップすることができPHPで可能ですか?

(JavaScriptでこれが悪のevalで行うことができる;)しかし、私はPHPでこれを行うための適切な方法があるかもしれないアイデアを得る)

+0

あなたはどのフレームワークを使用していますか? –

+0

**サービスマネージャ**とそのさまざまな実装(symfonyなど)の概念を調べることをお勧めします。その一部はまさにあなたがしようとしているものです。 – Calimero

+0

@AlivetoDie私たちはフレームワークを持っておらず、いずれかに切り替えることはできません。 @ Calimero ok、調査する、そこには、PHPでこの種の事を抽象化するためのstd戦略かもしれないと思った – John

答えて

2

はい、あなたは、フレームワークのいくつかの種類wihout(バニラでこれを行うことができます)各関数に$thisを返すことにより、PHP。あなたはいつもあなたはいつもあなたがエラー処理のためのexceptionsを使用する必要があります$this一緒に連鎖クラスから追加メソッドを(例えば$form->addHiddenElement('name','value')->addTextInputElement('name','value');

戻ってきていることから$this戻ってきていることから、このクラスをこのように

class Form{ 
    public function addHiddenElement($name, $value) 
    { 
     /**Do some stuff**/ 
     return $this; //This will allow you to chain additional functions 
    } 
    public function addTextInputElement($name, $value) 
    { 
     /** Do some more stuff */ 
     return $this; 
    } 
} 

を考えてみましょう。

EDIT:あなたはこのように簡単な関数を使用することができます関数のリストを生成するための設定を使用するには:

function buildForm($config) 
{ 
    $form = new Form(); //Create the form object 
    foreach($config as $function=>$params){ //iterate over the requested functions 
     if(method_exists($form, $function){ //Confirm the function exists before attemting execution 
      /** Updating $form to the result of the function call is equivalent to chaining all the functions in the $config array */ 
      $form = call_user_func_array(array($form, $function), $params); 
     } 
    } 
    return $form; 
} 

あなたは、このような関数を呼び出します。

$config = [ 
    'addHiddenElement' => [ 
     'somename', 'value' 
    ], 
    'addTextInputElement' => [ 
     'someothername', 'value' 
    ] 
]; 
$form = buildForm($config); 

この機能は、あなたの関数を連鎖さと機能的に同等です。

いくつかの注意点に注意してください。

  1. 上記機能は、すべてのメソッドは、$configリターン$thisに含まれることを前提としています。必要に応じて、検証ロジックを追加して、そうでないメソッドを説明することもできます。
  2. この関数は、FormのANYパブリックメソッドを呼び出せるようにするために、関数を実行する前に$configを検証するロジックを追加すると便利です。
+0

こんにちは、ええ、私たちは現在のオブジェクト($ this)を返すフォームビルダーを持っているので、チェーンを有効にします。しかし、私たちは現在、設定を介してすべてのものを呼び出すことができるようにしています。 – John

+0

私は私の答えを編集して誤解しました。 – GentlemanMax

+0

ああ、もちろん..!各関数がこれを返すと、これを再び呼び出すことができます。完璧なおかげで多く:) – John

関連する問題