有没有办法防止 Symfony 4 中控制器方法的多次执行?

Rmy*_*my5 1 locking symfony symfony4

我有一项服务,可以通过自定义命令和 HTML 页面使用。我想防止并行多次执行该服务。对于该命令,有一个 Lock 组件来执行此操作。但是控制器方法是否可以实现同样的目标?

如果从控制器调用该服务,锁定组件将不起作用:

    $store = new FlockStore(sys_get_temp_dir());
    $factory = new Factory($store);
    $lock = $factory->createLock('MY_SERVICE');
Run Code Online (Sandbox Code Playgroud)

我想避免从控制器调用命令(这就是我创建服务的原因),主要是因为该服务的 HTML 页面和 CLI 的输出不同。

小智 5

将锁工厂直接注入到您的服务中,而不是在命令和控制器中创建锁。

首先你必须安装锁定组件:

composer require symfony/lock

然后,例如,您可以像这样声明您的服务:

use Symfony\Component\Lock\Factory as LockFactory;

class MyService {
    private $lock;

    public function __construct(LockFactory $lockFactory) {
        $this->lock = $lockFactory->createLock('LOCK_KEY');
    }

    public function doWork() {
        $this->lock->acquire();

        try {
            // DO THINGS
        } finally {
            $this->lock->release();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)