2

我在让我的学说水合器为我的退货表格补水时遇到问题。

发布表格。

我不断收到以下消息:

使用参数 [null] 执行“INSERT INTO worker_essay (title) VALUES (?)”时发生异常:SQLSTATE [23000]:违反完整性约束:1048 列“title”不能为空

但这不可能是正确的,因为我的表单上有一个验证器,需要插入这个值,但我的表单正在验证。

我非常感谢任何有关解决问题的帮助或建议,或有关如何发现导致问题的原因的建议。

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 转储清楚地包含这些值。

我附上我的工作报表类。你会注意到我使用了魔法 getter/setter。

<?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默认情况下,使用 getter 和 setter 水合和提取值。如果您的实体没有这些方法,则它无法正常工作。如果您不想使用 getter/setter,请new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement', false)使用new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement').

也许这不是保湿器不起作用的原因。请编辑您的第一篇文章并粘贴Workers\Entity\WorkerStatement课程。

编辑

Hydrator 正在调用 getTitle() 并且您的魔术方法正在尝试访问不存在的 getTitle 属性。你有三个选择:

  1. 将 DoctrineHydrator 更改为new DoctrineHydrator($objectManager, 'Workers\Entity\WorkerStatement', false).
  2. 添加 getter 和 setter。例如getTitle()setTitle($title)
  3. 重构魔术方法以接受 getProperty、setProperty。
于 2013-10-02T09:18:59.367 回答
0

实际上您不需要在表单中添加水合器,如果需要,可以在控制器(或服务)中使用它。

请在之前添加一个 var 转储:

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

并发布结果

于 2013-10-02T08:34:31.590 回答