0

そのため、上司と私は、フォーム要素をレンダリングする最善の方法について合意に達することができませんでした。フォームは次のようになります。

<form class='myform'>
    <input type=text class="username" />
    <span><img class="question-mark-icon" src='icon.png' /></span>
    <div class="tooltip"><p>Your username.</p></div>

    // Other form elements here
</form>

1 つまたは 2 つの同じ要素を持つ 3 つのフォームがあります。現在、それらはヘルパー関数を介してレンダリングされているため、それを呼び出すusername()と、その要素がツールチップと共にレンダリングされます。したがって、実際には、フォームの 1 つが次のようになります。

<form class='myform'>
     <?php username(); ?>

     // Other form elements here
</form>

それは問題なく動作すると思います。それがWordpressや私が読んだ他のコードで行われている方法なので、それがベストプラクティスだと思いました. しかし彼は、次のように OOP のようにオブジェクト指向にするべきだと主張しています。

class FormElements {
    public function username() {
       echo '<input type=text class="username" /><span><img class="question-mark-icon" src='icon.png' /></span>
       <div class="tooltip"><p>Your username.</p></div>';
    }
} 

usernameしたがって、明らかに入力をレンダリングするには次のようになります。

$formEls = new FormElements();
$formEls->username();

したがって、次のようなヘルパー関数に配置するのではなく、そのようにする方が良い/悪い理由を誰かが明確に教えてくれます:

function username() {
    echo '<input type=text class="username" /><span><img class="question-mark-icon" src='icon.png' /></span>
        <div class="tooltip"><p>Your username.</p></div>';
}

私の主張は、単純なヘルパー関数を使用して実行できるのに、単一の要素をレンダリングするためだけにクラスを作成するのはばかげているということですか? また、OOP の原則を正当化するものではありません。しかし、彼は私を信じようとせず、私の主張/理解を裏付ける権威のある記事または何かを彼に指摘するように私に頼みました.

編集:

また、クラスに配置しても問題ない理由を教えていただけますか? 適切なオブジェクト モデルを定義できませんでした。私は通常、明確なプロパティとアクションを持つオブジェクトのクラスを作成します。単一のフォーム要素の場合、クラスでラップする必要がある理由がわかりません。

4

4 に答える 4

1

それらを静的関数として定義する方が良いと思います:

class FormElements {
    public static function username() {
        // ...
    }
}

後で:

<?php FormElements::username() ?>
于 2013-07-02T01:24:05.353 に答える
1

クラスにメソッドが 1 つしかない場合は、そのクラスを作成する代わりにヘルパーを使用できます。将来的に新しい機能を追加する予定がある場合を除きます。その場合、私はこれらの部分に分けようとします...

たとえば、次のように分割できます。

1) 各フォーム フィールドを含む Form.class.php ファイル。それは次のようなものかもしれません...つまり:

class Form {
  private $fields = array();
  private $method;
  private $action;

  public _construct( $action, $method, $arrayWithFieldsData){ //here you should populate with FormField instances the private $fields array, and set the method and action attributes };
  public toHtml() { 
    //here you should RETURN a string 
    $output = '<form action="'.$this->action.'" method="'.$this->method.'" />';
    foreach($this->fields as $f){
      $output .= $f->toHtml();
    }
    return $output.' </form>';
  };
  public validate() { //here you could implement form validation };
}

2) getHtml() 署名を持つことができる AbstractFormField.class.php または FormFieldInterface.php

abstract class AbstractFormField {

    public function _construct($arrayOfHtmlAttrs){
      $this->htmlAttr = $arrayOfHtmlAttrs;
    }

    public function toHtml();
}

3) AbstractFormField を拡張するか FormFieldInterface を実装する各 FormField のクラス。すなわち: InputFormField.class.php、HiddenFormField.class.php、SelectFormField.class.php。

class InputFormField extends AbstractFormField {

    public method toHtml(){
      $out = '<input type="text" ';
      foreach ($this->htmlAttr as $key => $value){
        $out .= " $key = $value ";
      }
      $out .= " />
      return $out;
    }
}

4) このコードは html に入れることができますが、コントローラーで分離する方が良いでしょう:

<?php 
  $fields = array(
              'username' => array( 'text', array('value' => $username, 'class' => 'username-input', 'id' => "some-id-for-your-fields)),
              'password' => array( 'password', array('value' => $username, 'class' => 'username-pswd', 'id' => "some-id-for-your-field)),
  );
  $myForm = new Form($action, $method, $fields);
?>

5) そして、あなたの html でこれ:

  <?php echo $myForm->toHtml(); ?>
于 2013-07-02T04:27:10.590 に答える
1

クラスの書き方のほかに、スケーラビリティのポイントがあります。

fullNameこれを考慮してください: 後で、フォームに要素を追加する必要があることに気付きます。あなたのアプローチでは、 という新しい関数を追加しますfullName()。ここまでは順調ですが、さらに追加が必要な場合はどうすればよいでしょうか。あなたはたくさんの機能を持っているでしょう。たとえば、メールに同様の機能が必要な場合、物事が混乱し、現在どの機能が意図されているのか正確にはわかりません。クラスを使用すると、これは保守と拡張が容易になります。あなたはこれFormElement::username()EMailElement::username()、などだけをします。

(正確にこの方法で行うのが良い考えであるかどうかは無視してください。)

物事がどれだけ簡単になっているかわかりますか?

これをさらに推し進めて、 User次のようなクラスを追加できます。

class User {

    protected $infos = array();

    public function __construct($infos = array()) {
        $this->infos = $infos;
    }
}

これで、Element クラスはユーザー クラスを拡張し、たとえばユーザー名などのすべての情報を 1 か所から取得できるようになりました。

もちろん、次のような順序に従う必要があります。

$user = new User(array("username" => "Bob"));
$form_element = new FormElement($user);

クラスElementは次のようになります。

abstract class Element extends User {
    protected function getStyle($element);
    protected function getTag($element);
    // etc .. Add implementation as well!!
}

もちろん、 andElementによって拡張されるクラスを追加したり、インターフェースを追加したりできます。FormEmail

しかし、ここでは OOP アプローチを使用する方が良いようです。

于 2013-07-02T01:40:17.533 に答える
1

たぶんこれが役立ちます。私は過去に、CodeIgniter php フレームワークの上で動作するフォームジェネレーターを実装しました。これにより、動的フォームを定義できます。フィールドごとに定義することも、Doctrine ORM モデル定義から 1 行でフォームを作成することもできます。また、他の ORM と連携するように拡張することもできます。たぶん、あなたのアイデアを実装する方法についてのアイデアを提供するのは役に立たないでしょう. 私はもうそれを維持していません。もちろん、ニーズに合っていると思われる場合は、自由に使用してください。

私は 2 年以上前に実装し、約 1 年間、プロダクション プロジェクトで使用しました。それを繰り返し、徐々に改善する機会を与えてくれました。後で、1 つのコミット内にパケット化し、Github にプッシュしました。最先端技術ではありません。

たとえば、コードを単純化し、より柔軟にするために、魔法のメソッドをより活用します (たとえば、私の意見では Java に見える FormField クラスなど)。

コードは次のとおりです。

https://github.com/theconejou/form_generator

ここにコアクラスがあります。

https://github.com/theconejou/form_generator/tree/master/forms/base

PS:うーん...私は長い時間の後にコードを読んでいますが、今日は間違いなく別のことをします:いくつかのクラスのメソッドが大きすぎ、単純さが少なすぎ、PHPにはJavaが多すぎます...とにかく...

于 2013-07-02T01:45:30.903 に答える