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

Php 在持久化之前将表单数据绑定到变量-Symfony2/Doctrine2,php,forms,symfony,doctrine-orm,entity,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

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

我当前的实体代码如下:

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();
有相当多的代码,但我想我已经删除了所有无关的东西

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

  • 用户输入尺寸和单位(例如100克)单击提交
  • 新质量($尺寸,$单位);将$size按$unit转换为Mg
  • 数据现在保存到数据库中
  • 如果我自己指定set$unit变量,它可以正常工作($unit='g'),但是当我试图通过$this getUnit传递该单位时;未发送任何内容,将$unit变量保留为null

      Unknown unit of measure ()
    
    如果我尝试执行相同的操作,但更新一个预先存在的条目,则效果很好,但总是落后一步,例如:

    因此,如果它的“g”在数据库中设置,并且我尝试转换一个“oz”,它将转换为“g”,然后在下一次尝试时,如果我输入kg,它将从之前转换为oz

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

    我现在真的花了这么多时间在这件事上,昨天晚上我醒过来想了太多次,我就是不能放弃,现在我感觉很亲近

    ((我使用的单位转换器只是以防万一有人想知道))

    谢谢Jenechka 在我的字典里

        lifecycleCallbacks:
        prePersist: [ setCreatedAtValue, fixSize ]
        preUpdate: [ setUpdatedAtValue, fixSize ]
    
    现在快乐:)谢谢。

    尝试“固定”大小

    或者以另一种方式

    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;
    }
    

    第一个很好用(我认为还没有完全测试)。非常感谢。我所做的错误只是在我的orm.yml生命周期中注册它时,我做了两个新的prePer和preUpdate,它本应该在现有的那些用逗号分隔的地方。
    /**
     * @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;
    }