text-media/offline-locker-bundle

Symfony OfflineLockerBundle

Installs: 3 675

Dependents: 0

Suggesters: 0

Security: 0

Type:symfony-bundle

dev-master 2019-01-23 11:43 UTC

This package is not auto-updated.

Last update: 2024-11-21 18:23:57 UTC


README

Packagist Packagist

Модуль Symfony для длительных блокировок по ключам

Установка

Модуль устанавливается через добавление зависимости в composer

composer require text-media/offline-locker-bundle

В конфиг нужно добавить секцию offline_locker и дополнительный конфиг doctrine для отдельного подключения

offline_locker:
    # Используемый менеджер
    entity_manager: offline_locker

doctrine:
    # Отдельное подключение к БД
    dbal:
        connections:
            offline_locker:
                driver: pdo_sqlite
                path: "%kernel.cache_dir%/offline_locker.db"
                charset: UTF8
    orm:
        entity_managers:
            offline_locker:
                connection: offline_locker
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    OfflineLockerBundle: ~

Выполнить миграцию автоматически или вручную

php ./bin/console doctrine:schema:update --em=offline_locker --dump-sql

Использование

В контейнере зарегистрирован сервис \TextMedia\OfflineLockerBundle\OfflineLockerInterface (или offline_locker) реализующий одноименный интерфейс

<?php
    use TextMedia\OfflineLockerBundle\ConcurrencyException;
    use TextMedia\OfflineLockerBundle\OfflineLockerInterface;

    class MyService
    {
        public function __construct(OfflineLockerInterface $locker)
        {
            $lockKey = 'order::1000';
            $lockOwner = __CLASS__;
            try {
                # Захватить блокировку
                $locker->acquireLock($lockKey, $lockOwner);
            } catch (ConcurrencyException $e) {
                # Блокировка не захвачена
            }

            try {
                $this->doSomething();
            } finally {
                # Освободить блокировку
                $locker->releaseLock($lockKey, $lockOwner);
            }
        }
    }