目前我正在尝试将用户选择的选项绑定到变量,然后在持久化数据之前在函数中使用该变量。
我当前的实体代码是:
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();
还有相当多的代码,但我想我已经删除了所有不相关的内容。
所以..基本上我想做的是:
如果我自己指定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/只是因为有人想知道))
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 ]
现在开心:)谢谢。
答案 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;
}