2

ドクトリン ハイドレーターでリターン ポスト フォームをハイドレートするのに問題があります。

フォームを投稿します。

次のメッセージが表示され続けます。

'INSERT INTO worker_essay (title) VALUES (?)' をパラメーター [null] で実行中に例外が発生しました: SQLSTATE[23000]: 整合性制約違反: 1048 列 'title' を null にすることはできません

しかし、フォームにこの値を挿入する必要があるバリデータがあるため、これは正しくありませんが、フォームは検証中です。

問題を解決するための助けやアドバイス、または問題の原因を発見する方法についてのアドバイスをいただければ幸いです。

public function getInputFilterSpecification()
  {
        return array(
            'title' => array(
                'required' => true
            ),
        );
    }

これらは、返されたフォームからの var_dumped 値です。

object(Zend\Stdlib\Parameters)[146]   public 'WorkerStatement' => 
     array (size=2)
       'id' => string '' (length=0)
       'title' => string 'the values from title' (length=21)   public 'submit' => string 'Submit' (length=6)

ご覧のとおり、値は明らかにそこにあります。これは、ハイドレーターに問題がある可能性があることを意味します。

私は今、残りの書類を同封しました。

コントローラー

public function workerStatementAction()
    {
         $form = new CreateWorkerStatementForm($this->getEntityManager());

         $workerStatement = new WorkerStatement();
      //  $form->setInputFilter($workerEssay->getInputFilter());
         $form->bind($workerStatement);
       //    var_dump($workerStatement); die();
          if ($this->request->isPost()) {
            $post  = $this->request->getPost();
            $form  =  $form->setData($this->request->getPost());
             if ($form->isValid()) {
                $post =$this->request->getPost();
                  $this->getEntityManager()->persist($workerStatement);
                 $this->getEntityManager()->flush();
             // Redirect to list of aboutyou
             return $this->redirect()->toRoute('worker');    
             }
         }
         return array('form' => $form);

    } 

フィールドセット

class WorkerStatementFieldset extends Fieldset implements InputFilterProviderInterface
{
   public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('WorkerStatement');


        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement'))
             ->setObject(new WorkerStatement());


  $this->add(array(
            'name' => 'title',
            'type' => 'Zend\Form\Element\Text',
            'options' => array(
                'label' => 'title',
            ),
        ));

}

** フォーム**

class CreateWorkerStatementForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('WorkerStatement');

        // The form will hydrate an object of type "AboutYou"
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement'));

        // Add the user fieldset, and set it as the base fieldset
      $workerStatementFieldset = new WorkerStatementFieldset($objectManager);
      $workerStatementFieldset->setUseAsBaseFieldset(true);
      $this->add($workerStatementFieldset);
 }
}

var_daumpコントローラーの永続化は次のとおりです。

 $this->getEntityManager()->persist($workerStatement);



object(Workers\Entity\WorkerStatement)[351]
  protected 'id' => null
  protected 'title' => null

それらは空ですが、返された投稿からの値の var ダンプには明らかに値が含まれていることに注意してください。

ワークステートメント クラスを同封します。魔法のゲッター/セッターを使用したことに気付くでしょう。

<?php

namespace Workers\Entity;

use Doctrine\ORM\Mapping as ORM;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface; 

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
/**
 *
 * @ORM\Entity
 * @ORM\Table(name="worker_essay")
 * @property string $title
 */
class WorkerStatement   
{


    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;


     /**
     * @ORM\Column(type="string")
     */
    protected $title;

    /**
* Magic getter to expose protected properties.
*
* @param string $property
* @return mixed
*/
public function __get($property)
{
return $this->$property;
}

/**
* Magic setter to save protected properties.
*
* @param string $property
* @param mixed $value
*/
public function __set($property, $value)
{
$this->$property = $value;
}




     public function getInputFilterSpecification()
    {
        return array(

            'title' => array(
                'required' => true
            )
        );
    }


}  
4

2 に答える 2

2

DoctrineHydratorデフォルトでは、ゲッターとセッターを使用して値を水和および抽出します。エンティティにこれらのメソッドがない場合、適切に機能しません。ゲッター/セッターを使用したくない場合は、new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement', false)代わりにnew DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement').

ハイドレーターが機能しない理由ではないかもしれません。最初の投稿を編集してWorkers\Entity\WorkerStatementクラスを貼り付けてください。

編集

Hydrator が getTitle() を呼び出しており、魔法のメソッドが存在しない getTitle プロパティにアクセスしようとしています。次の 3 つのオプションがあります。

  1. DoctrineHydrator を に変更しnew DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement', false)ます。
  2. ゲッターとセッターを追加します。たとえばgetTitle()setTitle($title).
  3. マジック メソッドをリファクタリングして、getProperty、setProperty を受け入れるようにします。
于 2013-10-02T09:18:59.367 に答える
0

実際には、フォームにハイドレーターを追加する必要はありません。必要に応じて、コントローラー (またはサービス) で使用します。

前に var ダンプを追加してください:

$this->getEntityManager()->persist($workerStatement);

そして結果を投稿する

于 2013-10-02T08:34:31.590 に答える