2

zf2、フォームバインドオブジェクトプロシージャに問題があります。簡単に言うと、フォームの検証が完了したら、フォームオブジェクトからエンティティへのデータ交換を自動化しようとしています。2つのインターフェイスInputFilterAwareInterfaceArraySerializableInterfaceを実装しましたが、以前のインターフェイスはフォームオブジェクトが入力フィルターを取得し、後のインターフェイスがフォームとエンティティからのデータ交換用です。以下は、私のコントローラーに配置されたコードの短いスニペットです。

//Controller code
$companyForm = new \Manage\Forms\CompanyForm();
$companyEntity = $this->getServiceLocator()->get('Manage/CompanyEntity');
$postData = $this->getRequest()->getPost()->toArray();
$companyEntity->exchangeArray($postData);
$companyForm->bind($companyEntity);
if($companyForm->isValid(){
    ....
}

これにより、エンティティオブジェクトのexchangeArray()メソッドが自動的に呼び出されます。これは正しく行われますが、問題データが空であり、データ配列にinputfilterが設定されたキーが含まれており、他のすべてのデータキーが欠落していることです。

必要に応じて、コードスニペットを追加できます。

ありがとうRaj

4

2 に答える 2

5

エンティティをフォームにバインドするには、通常、ハイドレーターを使用します。ハイドレーターは、データの配列を値オブジェクトに変換し、その逆も同様です。したがって、エンティティに適した適切なハイドレーターを持つようにフォームを構成する必要があります。

たとえば、エンティティにさまざまなプロパティ(たとえば、、)があり、、、barおよびメソッドを構成している場合は、ハイドレーターを使用できます。bazFoogetBar()setBar()getBaz()setBaz()ClassMethods

use Zend\Form\Form;
use Zend\StdLib\Hydrator\ClassMethods;

class Foo extends Form
{
    public function __construct()
    {
        parent::__construct();

        $this->setHydrator(new ClassMethods);

       // More here for the elements now
    }
}

そしてあなたの実体:

class Foo
{
    public function getBar() {...}
    public function setBar() {...}

    public function getBaz() {...}
    public function setBaz() {...}
}

次に、コントローラーは次のようになります。

public function createAction()
{
    $entity = new My\Entity\Foo;
    $form   = new My\Form\Foo;
    $form->bind($entity);

    if ($this->getRequest()->isPost()) {
        $data = $this->getRequiest()->getPost();
        $form->setData($data);

        if ($form->isValid()) {
            // $entity is now populated with data
            // persist $entity here
        }
    }

    // create view model here
}

これは、フォームに要素「bar」と「baz」があり、「bar」と「baz」のフォームデータを取得してそれらをフィルタリングするための正しい入力フィルターを提供した場合に機能します。

于 2012-12-22T16:35:57.037 に答える
2

ClassMethodshydrator(抽出中)は、「getSomeProperty」などのゲッターからの結果をキー「some_property」の配列値に変換します

フォーム要素名が「someProperty」の場合、抽出とハイドレーションは発生しません。

基本的に:

"getProperty" getter <=> "property"キー(ここでは問題ありません)

"getSomeProperty" getter<=>"some_property"キー

キャメルケースのオブジェクトプロパティに対応するキャメルケースの名前を持つフォーム要素を抽出して水和するには、次のようにします。

$myform->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods(false));

「false」パラメーターは、キャメルケースを小文字に変換しないようにハイドレーターに指示します

フォームコンストラクターでそれを行うことができます。

于 2013-09-23T19:27:12.523 に答える