Forms 如何在zf2中输入表单验证后的计算值

Forms 如何在zf2中输入表单验证后的计算值,forms,validation,doctrine-orm,zend-framework2,Forms,Validation,Doctrine Orm,Zend Framework2,我正在zf2中开发一个表单,我想根据用户输入计算一个值,并在表单验证后在字段中设置它。表单中有一个firstName字段和一个lastName字段;我想使用经过验证的输入来计算一个值,以填充到fullName字段中 我假设我想这样设置值,但没有找到设置发送到数据库的“元素”的正确代码: public function addAction() { $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\Ent

我正在zf2中开发一个表单,我想根据用户输入计算一个值,并在表单验证后在字段中设置它。表单中有一个
firstName
字段和一个
lastName
字段;我想使用经过验证的输入来计算一个值,以填充到
fullName
字段中

我假设我想这样设置值,但没有找到设置发送到数据库的“元素”的正确代码:

public function addAction()
{
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    $form = new AddMemberForm($objectManager);
    $member = new Member();
    $form->bind($member);

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

        // develop full name string and populate the field
        $calculatedName = $_POST['firstName'] . " " . $_POST['lastName'];
        $member->setValue('memberFullName', $calculatedName);

        $this->getEntityManager()->persist($member);
        $this->getEntityManager()->flush();
        return $this->redirect()->toRoute('admin-members');
      }
    }

    return array('form' => $form);
}
条令的内置功能非常适合处理此类需求,我强烈建议使用它们

您只需要正确地注释实体

例如:

<?php
/**
 * Member Entity
 */
namespace YourNamespace\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Event\LifecycleEventArgs;

/**
 * @ORM\Table(name="members")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Member
{
    // After all of your entity properies, getters and setters... Put the method below

    /**
     * Calculate full name on pre persist.
     *
     * @ORM\PrePersist
     * @return void
     */
    public function onPrePersist(LifecycleEventArgs $args)
    {
        $this->memberFullName = $this->getFirstName().' '.$this->getLastName();
    }
}
的优秀答案提供了一个适用于添加操作的解决方案,对我的评论的回复将我引导到以下同时适用于添加和编辑操作的解决方案:

<?php
/**
 * Member Entity
 */
namespace YourNamespace\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Event\PreFlushEventArgs;

/**
 * @ORM\Table(name="members")
 * @ORM\Entity
 */
class Member
{
    // After all of your entity properies, getters and setters... Put the method below

    /**
     * Calculate full name on pre flush.
     *
     * @ORM\PreFlush
     * @return void
     */
    public function onPreFlush(PreFlushEventArgs $args)
    {
        $this->memberFullName = $this->getFirstName().' '.$this->getLastName();
    }
}

这适用于我的
添加操作
,但在我的
编辑操作
中不起作用。为什么会这样?是的,prepersist事件只在实体的初始持久化时触发(它不会在将来的更新时触发)。您可能需要仔细阅读文档。PreUpdate或PreFlush是您需要的。
<?php
/**
 * Member Entity
 */
namespace YourNamespace\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Event\PreFlushEventArgs;

/**
 * @ORM\Table(name="members")
 * @ORM\Entity
 */
class Member
{
    // After all of your entity properies, getters and setters... Put the method below

    /**
     * Calculate full name on pre flush.
     *
     * @ORM\PreFlush
     * @return void
     */
    public function onPreFlush(PreFlushEventArgs $args)
    {
        $this->memberFullName = $this->getFirstName().' '.$this->getLastName();
    }
}