簡體   English   中英

在持久之前將表單數據綁定到變量-Symfony2 / Doctrine2

[英]Bind form data to variable before persist - Symfony2 / Doctrine2

目前,我正在嘗試將用戶選擇的選項綁定到變量,然后在持久存儲數據之前在函數中使用該變量。

我當前的實體代碼是這樣的:

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. 現在,數據將保存到數據庫中。

如果我自己指定set $ unit變量,它可以正常工作($ unit ='g'),但是當我嘗試通過$ this-getUnit傳遞單位時; 沒有發送任何內容,而將$ unit變量保留為null。

  Unknown unit of measure ()

如果我嘗試這樣做但更新現有條目,則可以正常工作,但始終落后一步,例如:

因此,如果在數據庫中設置了它的“ g”,而我嘗試轉換為“ oz”,它將轉換為“ G”,然后在下一次嘗試下,如果我說輸入kg,它將由之前的oz轉換。

我假設發生這種情況是因為表單有效,因此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 ]

現在快樂:)謝謝。

嘗試在prePersist或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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM