我希望每次新的时候Distance
保存实体(从 Place_A 到 Place_B),反向距离(从 Place_B 到 Place_A)也被插入到数据库中 https://stackoverflow.com/q/30569463/2516943.
我的问题是以下侦听器无限循环(因此是计数器):
class Listener
{
public $count;
public function prePersist(LifecycleEventArgs $eventArgs)
{
if ($this->count > 5) {
die();
}
$entity = $eventArgs->getEntity();
if ($entity instanceof Distance) {
// $this->created = microtime(true) in Distance's constructor
echo 'Entity created at ' . $entity->created;
if ($entity->isReverse) {
echo " is reverse\n";
} else {
echo " is not reverse\n";
$this->count++;
$reverse = new Distance();
$reverse->setOrigin($entity->getDestination());
$reverse->setDestination($entity->getOrigin());
$reverse->set($entity->getMiles());
$reverse->isReverse = true;
$em = $eventArgs->getEntityManager();
$em->persist($reverse);
$em->flush();
}
}
}
}
Output:
Entity created at 1433168310.8787 is not reverse
Entity created at 1433168310.9073 is reverse
Entity created at 1433168310.8787 is not reverse
Entity created at 1433168310.9078 is reverse
Entity created at 1433168310.8787 is not reverse
Entity created at 1433168310.908 is reverse
Entity created at 1433168310.8787 is not reverse
Entity created at 1433168310.9084 is reverse
Entity created at 1433168310.8787 is not reverse
Entity created at 1433168310.9087 is reverse
Entity created at 1433168310.8787 is not reverse
就像原始实体(创建时间以 8787 结尾)被保留了无数次。
以防万一,如果我删除对$em->flush
,我正确地得到以下输出:
Entity created at 1433167824.2552 is not reverse
Entity created at 1433167824.2947 is reverse
但随后出现异常,表示没有参数绑定到插入查询。 Symfony 的分析器证实了这一点:
INSERT INTO Distance (
miles, origin_id, destination_id
)
VALUES
(?, ?, ?)
Parameters: { }
我想了解为什么我的侦听器不能按我的预期工作,以及如何修复它。
根据要求,这里有更多代码。一切都源于一个Place
除了输入地名之外,我还可以添加/删除/编辑到其他地方的距离集合Place
s.
// PlaceController::updateAction
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MyBundle:Place')->find($id);
if (! $entity) {
throw $this->createNotFoundException('Unable to find Place entity.');
}
$deleteForm = $this->createDeleteForm($id);
$editForm = $this->createForm(new PlaceType(), $entity, array(
'action' => $this->generateUrl('update_place', array('id' => $entity->getId())),
'method' => 'PUT'
));
$editForm->add('submit', 'submit', array('label' => 'panel.button.save'));
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$em->flush();
return array(
'entity' => $entity,
'form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
);
}
// PlaceType::buildForm
public function buildForm(FormBuilderInterface $builder, array $options)
{
$Place = $builder->getData();
$builder
->add(
'name',
'text',
[
'label' => 'object.place.name'
]
)
->add(
'distancesTo',
'collection',
[
'label' => 'object.place.distance.plural',
'type' => new DistanceType(),
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
'options' => [
'required' => false,
'origin' => $Place->getId() ? $Place : null
]
]
);
}