Forms zendframework 2条令2我的帖子表单没有返回值

Forms zendframework 2条令2我的帖子表单没有返回值,forms,zend-framework2,Forms,Zend Framework2,我对此有点困惑 “我的帖子表单”没有填充从返回的帖子值中接收到的值;我怀疑问题是由我的jobsort类值中的getJobId()引起的 以下是我的表格: public function jobSortAction() { $form = new CreateJobSortForm($this->getEntityManager()); $jobSort = new JobSort(); $form->setInput

我对此有点困惑

“我的帖子表单”没有填充从返回的帖子值中接收到的值;我怀疑问题是由我的jobsort类值中的getJobId()引起的

以下是我的表格:

public function jobSortAction()
    {

         $form = new CreateJobSortForm($this->getEntityManager());

         $jobSort = new JobSort();

         $form->setInputFilter($jobSort->getInputFilter());

         $id= 11;
         $jobSort->setId($id);

         $form->bind($jobSort);

         if ($this->request->isPost()) {
  //$post     = $this->request->getPost();      
             $form->setData($this->request->getPost());
  //var_dump($post);
  //var_dump($jobSort);               

             if ($form->isValid()) {


                  $this->getEntityManager()->persist($jobSort);
                 $this->getEntityManager()->flush();
             }
         }
         return array('form' => $form);
    } 
下面是“return post values”和Jobsort()对象的var_转储值。您将注意到,返回的post值具有Id和JobId的值

object(Zend\Stdlib\Parameters)[168]
  public 'JobSort' => 
    array (size=2)
      'jobId' => string '5' (length=1)
      'id' => string '11' (length=2)
  public 'submit' => string 'Submit' (length=6)

object(Workers\Entity\JobSort)[394]
  protected 'inputFilter' => null
  protected 'id' => int 11
  protected 'jobId' => null
  protected 'workerservicelist' => null
然而,当我填充这些值时,它似乎并没有记录jobId的值

下面是我的jobsort实体类:

class JobSort  
{
   protected $inputFilter;

    /**
     * @ORM\Id
     * 
     * @ORM\Column(name="user_id", type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(name="jobId", type="integer")
     */
    protected $jobId;


 public function setId($id)
    {
        return $this->id = $id;
    }


    public function getId()
    {
        return $this->id;
    }

    public function setJobId($jobId)
    {
        return $this->jobId = $jobId;
    }

    public function getJobId( )
    {
        return $this->jobId;
    }
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

class CreateJobSortForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-Job-post-form');

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

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


        // Optionally set your validation group here


        // … add CSRF and submit elements …

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
                'id' => 'submitbutton',
            ),
        )); 

        // Optionally set your validation group here
    }
}
class JobSortFieldset extends Fieldset 
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('JobSort');
        $id= 10;
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\JobSort'))
             ->setObject(new JobSort());


        }
}
public function jobSortAction()
    {
         $serviceLocator = $this->getServiceLocator();
         $objectManager = $this->getEntityManager();

         $form = new CreateJobSortForm($this->getEntityManager());

         if ($this->request->isPost())
         {
            $form->setData($this->request->getPost());

             if ($form->isValid()) {
                 $entity = $form->getData();

              $model = new JobSort($objectManager, $serviceLocator);
              $model->getEntityManager()->persist($entity);
              $model->getEntityManager()->flush();

             }
         }
        return array('form' => $form);
     } 
对于我需要做什么来找出为什么没有填充值,是否有任何建议

问候

安德烈

顺便说一下,当我将类jobsort的Id设置为 @ORM\GeneratedValue(策略=“自动”)

当我取出它并将其设置为手动时,问题就开始了

你好

这是我的表格:

public function jobSortAction()
    {

         $form = new CreateJobSortForm($this->getEntityManager());

         $jobSort = new JobSort();

         $form->setInputFilter($jobSort->getInputFilter());

         $id= 11;
         $jobSort->setId($id);

         $form->bind($jobSort);

         if ($this->request->isPost()) {
  //$post     = $this->request->getPost();      
             $form->setData($this->request->getPost());
  //var_dump($post);
  //var_dump($jobSort);               

             if ($form->isValid()) {


                  $this->getEntityManager()->persist($jobSort);
                 $this->getEntityManager()->flush();
             }
         }
         return array('form' => $form);
    } 
这是我收到的错误信息

An exception occurred while executing 'INSERT INTO worker_main_jobsort (user_id, jobId) VALUES (?, ?)' with params [11, null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'jobId' cannot be null
这是我的表格:

class JobSort  
{
   protected $inputFilter;

    /**
     * @ORM\Id
     * 
     * @ORM\Column(name="user_id", type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(name="jobId", type="integer")
     */
    protected $jobId;


 public function setId($id)
    {
        return $this->id = $id;
    }


    public function getId()
    {
        return $this->id;
    }

    public function setJobId($jobId)
    {
        return $this->jobId = $jobId;
    }

    public function getJobId( )
    {
        return $this->jobId;
    }
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

class CreateJobSortForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-Job-post-form');

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

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


        // Optionally set your validation group here


        // … add CSRF and submit elements …

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
                'id' => 'submitbutton',
            ),
        )); 

        // Optionally set your validation group here
    }
}
class JobSortFieldset extends Fieldset 
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('JobSort');
        $id= 10;
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\JobSort'))
             ->setObject(new JobSort());


        }
}
public function jobSortAction()
    {
         $serviceLocator = $this->getServiceLocator();
         $objectManager = $this->getEntityManager();

         $form = new CreateJobSortForm($this->getEntityManager());

         if ($this->request->isPost())
         {
            $form->setData($this->request->getPost());

             if ($form->isValid()) {
                 $entity = $form->getData();

              $model = new JobSort($objectManager, $serviceLocator);
              $model->getEntityManager()->persist($entity);
              $model->getEntityManager()->flush();

             }
         }
        return array('form' => $form);
     } 
下面是fieldset类:

class JobSort  
{
   protected $inputFilter;

    /**
     * @ORM\Id
     * 
     * @ORM\Column(name="user_id", type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(name="jobId", type="integer")
     */
    protected $jobId;


 public function setId($id)
    {
        return $this->id = $id;
    }


    public function getId()
    {
        return $this->id;
    }

    public function setJobId($jobId)
    {
        return $this->jobId = $jobId;
    }

    public function getJobId( )
    {
        return $this->jobId;
    }
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

class CreateJobSortForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-Job-post-form');

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

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


        // Optionally set your validation group here


        // … add CSRF and submit elements …

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
                'id' => 'submitbutton',
            ),
        )); 

        // Optionally set your validation group here
    }
}
class JobSortFieldset extends Fieldset 
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('JobSort');
        $id= 10;
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\JobSort'))
             ->setObject(new JobSort());


        }
}
public function jobSortAction()
    {
         $serviceLocator = $this->getServiceLocator();
         $objectManager = $this->getEntityManager();

         $form = new CreateJobSortForm($this->getEntityManager());

         if ($this->request->isPost())
         {
            $form->setData($this->request->getPost());

             if ($form->isValid()) {
                 $entity = $form->getData();

              $model = new JobSort($objectManager, $serviceLocator);
              $model->getEntityManager()->persist($entity);
              $model->getEntityManager()->flush();

             }
         }
        return array('form' => $form);
     } 
此添加是对rafaame解决方案的响应

class JobSort  
{
   protected $inputFilter;

    /**
     * @ORM\Id
     * 
     * @ORM\Column(name="user_id", type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(name="jobId", type="integer")
     */
    protected $jobId;


 public function setId($id)
    {
        return $this->id = $id;
    }


    public function getId()
    {
        return $this->id;
    }

    public function setJobId($jobId)
    {
        return $this->jobId = $jobId;
    }

    public function getJobId( )
    {
        return $this->jobId;
    }
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

class CreateJobSortForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-Job-post-form');

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

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


        // Optionally set your validation group here


        // … add CSRF and submit elements …

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
                'id' => 'submitbutton',
            ),
        )); 

        // Optionally set your validation group here
    }
}
class JobSortFieldset extends Fieldset 
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('JobSort');
        $id= 10;
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\JobSort'))
             ->setObject(new JobSort());


        }
}
public function jobSortAction()
    {
         $serviceLocator = $this->getServiceLocator();
         $objectManager = $this->getEntityManager();

         $form = new CreateJobSortForm($this->getEntityManager());

         if ($this->request->isPost())
         {
            $form->setData($this->request->getPost());

             if ($form->isValid()) {
                 $entity = $form->getData();

              $model = new JobSort($objectManager, $serviceLocator);
              $model->getEntityManager()->persist($entity);
              $model->getEntityManager()->flush();

             }
         }
        return array('form' => $form);
     } 
我按照建议修改了我的表格;然而,它仍然不起作用。我认为现在的问题是Rafame解决方案是关于zendDB保存方法的,但我使用的是doctrineperis**t和**flush方法。我相应地得到以下错误消息

调用未定义的方法Workers\Entity\JobSort::save()

以下是我的修订表格:

public function jobSortAction()
    {
         $form = new CreateJobSortForm($this->getEntityManager() );

         $jobSort = new JobSort();

         if($this->request->isPost())
        {
             $form->setData($this->request->getPost());

             if ($form->isValid())
             {
                $entity = $form->getData();
                $model = new JobSort();
                $model->save($entity);

               // $this->getEntityManager()->persist( $model);
             //   $this->getEntityManager()->flush();
             }
         }
         return array('form' => $form);
    } 
在回答关于我有什么问题的问题时,我现在收到的信息是: **

EntityManager#persist()希望参数1是实体对象, 给定的数组

**

下面是我的功能:

class JobSort  
{
   protected $inputFilter;

    /**
     * @ORM\Id
     * 
     * @ORM\Column(name="user_id", type="integer")
     */
    protected $id;

    /**
     * @ORM\Column(name="jobId", type="integer")
     */
    protected $jobId;


 public function setId($id)
    {
        return $this->id = $id;
    }


    public function getId()
    {
        return $this->id;
    }

    public function setJobId($jobId)
    {
        return $this->jobId = $jobId;
    }

    public function getJobId( )
    {
        return $this->jobId;
    }
use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

class CreateJobSortForm extends Form
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('create-Job-post-form');

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

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


        // Optionally set your validation group here


        // … add CSRF and submit elements …

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Submit',
                'id' => 'submitbutton',
            ),
        )); 

        // Optionally set your validation group here
    }
}
class JobSortFieldset extends Fieldset 
{
    public function __construct(ObjectManager $objectManager)
    {
        parent::__construct('JobSort');
        $id= 10;
        $this->setHydrator(new DoctrineHydrator($objectManager, 'Workers\Entity\JobSort'))
             ->setObject(new JobSort());


        }
}
public function jobSortAction()
    {
         $serviceLocator = $this->getServiceLocator();
         $objectManager = $this->getEntityManager();

         $form = new CreateJobSortForm($this->getEntityManager());

         if ($this->request->isPost())
         {
            $form->setData($this->request->getPost());

             if ($form->isValid()) {
                 $entity = $form->getData();

              $model = new JobSort($objectManager, $serviceLocator);
              $model->getEntityManager()->persist($entity);
              $model->getEntityManager()->flush();

             }
         }
        return array('form' => $form);
     } 
我的形式;i、 e水合器应设置在何处

namespace Workers\Form;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\Form\Form;
use Workers\Form\Fieldset\JobSortFieldset;

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

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

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

如果检查代码,则创建JobSort实体,仅设置其id并将其绑定到表单:

$jobSort = new JobSort();
$jobSort->setId($id);
$form->bind($jobSort);
在此之后,您将转储$jobSort和$this->request->getPost()。因此,很明显,您是在POST数据中获得jobId,而不是在实体中(在将实体绑定到表单之前,您没有设置实体的jobId)。您实体的代码没有问题

解决方法是:不要将任何内容绑定到表单。只有在执行编辑操作时,才应将实体绑定到表单,即从数据库中获取实体并希望用其值填充表单

添加操作的示例:

编辑操作的示例:

希望这有帮助

编辑:

我所提供的是一个例子,说明了如何使用条令2+ZF2处理表单和实体

你需要记住的是,条令与模型的概念无关,它只理解实体。我在应用程序中使用的模型是MVC(模型-视图-控制器)设计模式(ZF2使用)的概念,我决定将实体管理器调用(persist和flush)封装在模型的方法中,我将其命名为save()(如果实体在保存到数据库之前需要进行一些特殊处理,并且还因为直接在控制器中使用实体管理器不是一种好的做法,请参见Marcos Pivetta演示的这张幻灯片)

另一件您可能会误解的事情是,当您对具有DoctrineObject hydrator的窗体执行$form->getData()操作时,它将返回实体对象,而不是包含数据的数组(如果没有hydrator,则最后会发生这种情况)。因此,您不需要在执行$form->getData()之后创建实体,如果您这样做,则此创建的实体将不会包含表单提供的任何信息

您的代码现在应该可以工作了:

public function jobSortAction()
{
     $serviceLocator = $this->getServiceLocator();
     $entityManager = $this->getEntityManager();

     $form = new CreateJobSortForm($entityManager);

     if ($this->request->isPost())
     {

        $form->setData($this->request->getPost());

         if ($form->isValid()) {

             //I'm considering you are setting the DoctrineObject hydrator to your form,
             //so here we will get the entity object already filled with the form data that came through POST.
             $entity = $form->getData();

             //Again, if you need special treatment to any data of your entity,
             //you should do it here (well, I do it inside my model's save() method).
             //$entity->setJobId(11);

             $entityManager->persist($entity);
             $entityManager->flush();

         }

     }

    return array('form' => $form);

 }

你能粘贴你的表单代码吗?谢谢Shello Rafame。我已经编辑了我的页面以包含表单Rafame。谢谢你到目前为止的帮助。不幸的是,我仍然有问题。我认为你的解决方案不适用于doctrine2。即doctrine使用persist adn flush方法。你知道我如何修改你的解决方案吗。我在上面附上了代码你好dreea115,我的解决方案是针对原则2。持久化和刷新调用在模型的save()方法中是隐式的。您可以将$objectManager->persist($entity);$objectManager->flush()替换为$model->save($entity)行。您现在遇到了什么问题?再次您好Rafame,很抱歉在这件事上遇到了持续的麻烦。我已经在上面附上了我现在收到的错误报告。非常感谢您就如何继续提供一些建议。热烈的问候Andrea您好Andrea115,请检查我的答案编辑。我希望这对您有所帮助。如果您点击+1按钮(我的答案左边的向上箭头)我非常感激。你好,拉法姆。我很抱歉,但我仍然有问题。我的表格上似乎没有设置水合器;因此我只收到来自回传站的数组。我附上了上面的代码;你会看到我实际上设置了水合器。你知道为什么没有设置水合器吗