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();
有相当多的代码,但我想我已经删除了所有无关的东西
所以。。基本上我想做的是:
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;
}