如何在Symfony3.4中使用Lock Component和username
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Symfony3.4中使用Lock Component和username相关的知识,希望对你有一定的参考价值。
我试图在symfony 3.4中使用锁组件,就像在https://symfony.com/doc/3.4/components/lock.html上描述的那样
我想阻止来自不同用户的多个数据更改。
例如,user1使用数据调用相同的公司表单,然后是user2
如何告诉user2,user1阻止了编辑数据(包括用户名)?
更新:它用于后端,许多员工编辑客户数据,订单等。此表单仅供编辑。这意味着,如果他们想要更新某些数据,他们会点击“编辑”。在将数据加载到表单之前,当另一名员工更改此记录时,应通知他们。员工有时需要一些时间来改变一切。如果员工在保存时收到消息,则必须返回,重新加载数据并重新开始。
我的控制器的一个例子:
public function CompanyEdit(Request $request)
$error = null;
$company_id = $request->get('id');
// if (!preg_match('/^\d+$/', $company_id))
// return $this->showError();
//
$store = new SemaphoreStore();
$factory = new Factory($store);
$lock = $factory->createLock('company-edit-'.$company_id, 30);
if(!$lock->acquire())
//send output with username
// this data is locked by user xy
return 0;
$company = $this->getDoctrine()->getRepository(Company::class)->find($company_id);
$payment = $this->getDoctrine()->getRepository(Companypay::class)->findOneBy(array('company_id' => $company_id));
$form = $this->createFormBuilder()
->add('company', CompanyFormType::class, array(
'data_class' => 'AppBundle\Entity\Company',
'data' => $company
))
->add('payment', CompanyPayFormType::class, array(
'data_class' => 'AppBundle\Entity\CompanyPay',
'data' => $payment
))
->getForm();
$form->handleRequest($request);
$company = $form->get('company')->getData();
$payment = $form->get('payment')->getData();
if ($form->isSubmitted() && $form->isValid())
$event = new FormEvent($form, $request);
if ($payment->getCompanyId() == null)
$payment->setCompanyId($company->getId());
try
$this->getDoctrine()->getManager()->persist($company);
$this->getDoctrine()->getManager()->persist($payment);
$this->getDoctrine()->getManager()->flush();
$this->container->get('app.logging')->write('Kundendaten geändert', $company->getId());
catch (PDOException $e)
$error = $e->getMessage();
if (null === $response = $event->getResponse())
return $this->render('customer/edit.html.twig', [
'form' => $form->createView(),
'company' => $company,
'error' => $error,
'success' => true
]);
$lock->release();
return $response;
你不能(锁不能有任何元数据),但你可能首先不想要这个。
在这种情况下,您可以在用户打开编辑页面时创建锁定,并在用户提交表单时将其释放。但是,如果用户打开页面而不提交表单怎么办?为什么用户甚至无法查看表单?
这看起来像一个XY-problem。我认为你试图阻止用户在不知情的情况下覆盖数据。相反,您可以在更改实体后更改的表单中添加时间戳或哈希值。例如:
<form type="hidden" name="updatedAt" value=" company.updatedAt()|date('U') " />
并以您的形式:
<?php
if ($company->getUpdatedAt()->format('U') !== $form->get('updatedAt')->getData())
throw new \LogicException('The entity has been changed after you opened the page');
免责声明:代码未经过测试,仅作为此解决方案的示例。
以上是关于如何在Symfony3.4中使用Lock Component和username的主要内容,如果未能解决你的问题,请参考以下文章
Symfony3.4 / Doctrine迁移 - 驱动程序中发生异常:SQLSTATE [HY000] [2002]没有这样的文件或目录
Symfony3 onSecurityInteractiveLogin注销并设置flash
错误:预期的已知函数,在 symfony3.4 上得到 'CURDATE' [重复]