使用Zend Framework 2,我构建了一个简单的表单和相应的Doctrine 2实体。现在我想知道如何使用Doctrine正确保存表单。
如果我理解正确,我可以使用保湿器 - 数组格式的发布数据将转换为一个对象,然后可以由Doctrine(或类似的东西)处理,这是正确的吗?
目前我的表单如下:
use Zend\Form\Form;
class MyForm extends Form
{
public function __construct()
{
parent::__construct('MyForm');
$this->add(array(
'type' => 'text',
'name' => 'firstName',
'options' => array(
'label' => 'First Name',
)
));
$this->add(array(
'type' => 'submit',
'name' => 'submit',
'options' => array(
'label' => Submit'
),
'attributes' => array(
'value' => 'Submit Form',
),
));
}
}
这样的实体:
class Form
{
protected $firstName;
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
}
}
如您所见,字段名称与实体中的相应变量匹配。这需要吗?我使用以下控制器代码让它像这样工作,但我不认为这是正确的方法:
use SomeForm\Form\MyForm;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
class FormsController extends AbstractActionController
{
public function saveAction()
{
$entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$hydrator = new DoctrineHydrator($entityManager);
$request = $this->getRequest();
$form = new MyForm();
$form->setHydrator($hydrator);
$entity = new \SomeForm\Entity\Form();
$form->bind($entity);
if ($request->isPost()) {
$data = $request->getPost();
$form->setData($data);
// Nothing is validated here
if ($form->isValid()) {
$entityManager->persist($entity);
$entityManager->flush();
return $this->redirect()->toRoute('home');
}
}
}
}
在研究如何工作时,我还遇到了代码示例,其中包含一个名为populate
的函数,该函数将表单的发布数据映射到实体。我需要这样的功能吗?如何在不破坏任何内容的情况下更改字段名称?我的代码是正确的还是我做的事情不是他们应该如何做的?
我知道ZF2有一个使用实体getter / setter方法的ClassMethods
保湿器 - Doctrine 2是否也这样做?