在持久化之前将表单数据绑定到变量 - Symfony2 / Doctrine2

时间:2014-03-07 20:11:20

标签: php forms symfony doctrine-orm entity

目前我正在尝试将用户选择的选项绑定到变量,然后在持久化数据之前在函数中使用该变量。

我当前的实体代码是:

public function setUnit($unit)
{
    $this->unit = $unit;
    return $this;
}
public function getUnit()
{
    return $this->unit;
}
public function setSize($size)
{        
    $unit = $this->getUnit();
    $this->size = $size = new Mass($size, $unit);
    $this->size = $size->toUnit('mg');      
    return $this;
}

我的表格:

    $builder
        ->add('size')
        ->add('unit')
        ;

最后我的控制器:

 public function createAction(Request $request)
 {
    $entity = new Products();

    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);


    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $entity->setUser($this->get('security.context')->getToken()->getUser());
        $em->persist($entity);
        $em->flush();

还有相当多的代码,但我想我已经删除了所有不相关的内容。

所以..基本上我想做的是:

  1. 用户输入尺寸和单位(例如100克)点击提交。
  2. 新弥撒($ size,$ unit);将$ size $ unit转换为Mg
  3. 现在数据已持久保存到数据库中。
  4. 如果我自己指定set $ unit变量,它工作正常($ unit ='g')但是当我尝试通过$ this-getUnit传递单位时;没有发送任何内容,将$ unit变量保留为null。

      Unknown unit of measure ()
    

    如果我尝试做同样的事情,但更新一个现有的条目,它工作正常,但总是落后一步:

    因此,如果它在数据库中设置了'g'并且我尝试转换'oz'它会转换'G'然后在下一次尝试时如果我输入kg它将转换为之前的oz。 / p>

    我假设这种情况正在发生,因为表单是有效的,所以Symfony尝试持久化实体,但随后点击新的Mass函数抛出错误,因为它还没有发送$ unit变量。如何在持久性之前发送$ unit变量,以便将其转换为新的$ size。

    现在已经认真度过了这么多时间,昨晚我醒来想了很多次,我现在不能放弃,我感觉如此接近。

    ((我正在使用的单位转换器是https://github.com/triplepoint/php-units-of-measure/只是因为有人想知道))

    感谢Jenechka

    public function setSize($size)
    {
        $this->size = $size;       
        return $this;
    }
    
    /**
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function fixSize()
    {
        $unit = $this->getUnit();
        $size = $this->getSize();
    
        $mass = new Mass($size, $unit);
        $this->size = $mass->toUnit('mg');      
    }
    

    和我的orm.yml

        lifecycleCallbacks:
        prePersist: [ setCreatedAtValue, fixSize ]
        preUpdate: [ setUpdatedAtValue, fixSize ]
    

    现在开心:)谢谢。

1 个答案:

答案 0 :(得分:1)

尝试在prePersist or preUpdate events中“修复”尺寸。

/**
 * @Entity
 * @HasLifecycleCallbacks
 */
class YourEntity {
    // ...

    public function setSize($size)
    {        
        $this->size = $size;
        return $this;
    }

    /**
     * @PrePersist
     * @PreUpdate
     */
    public function fixSize()
    {
        $unit = $this->getUnit();
        $size = $this->getSize();

        $mass = new Mass($size, $unit);
        $this->size = $mass->toUnit('mg');      
    }

或另一种方式

public function setUnit($unit)
{
    $this->unit = $unit;
    $this->updateSize();

    return $this;
}

public function setSize($size)
{        
    $this->size = $size;
    $this->updateSize();

    return $this;
}

public function updateSize()
{
    $unit = $this->getUnit();
    $size = $this->getSize();

    if ($unit && $size) {
        $mass = new Mass($size, $unit);
        $this->size = $mass->toUnit('mg');      
    }

    return $this;
}