我想通过使用 Symfony Lock 组件来防止用户两次发出相同的请求。因为现在用户可以点击链接两次(意外?)并创建重复的实体。我想使用不能防止竞争条件本身的唯一实体约束。
Symfony Lock 组件似乎没有按预期工作。当我在页面的开头创建一个锁并同时打开该页面两次时,两个请求都可以获取锁。当我在标准和隐身浏览器窗口中打开测试页面时,第二个请求没有获得锁。但是我在文档中找不到任何关于此链接到会话的内容。我在一个新项目中创建了一个小测试文件来隔离问题。这是使用 php 7.4 symfony 5.3 和 lock 组件
<?php
namespace App\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Routing\Annotation\Route;
class LockTest extends AbstractController
{
/**
* @Route("/test")
* @Template("lock/test.html.twig")
*/
public function test(LockFactory $factory): array
{
$lock = $factory->createLock("test");
$acquired = $lock->acquire();
dump($lock, $acquired);
sleep(2);
dump($lock->isAcquired());
return ["message" => "testing"];
}
}