text-media / offline-locker-bundle
Symfony OfflineLockerBundle
dev-master
2019-01-23 11:43 UTC
Requires
- php: >=7.0
- doctrine/doctrine-bundle: ^1.9
- doctrine/orm: ^2.6
- monolog/monolog: ^1.23
- symfony/console: ^4.2
- symfony/framework-bundle: ^4.2
- symfony/proxy-manager-bridge: ^4.2
Requires (Dev)
- phpunit/phpunit: ^5.6
- squizlabs/php_codesniffer: ^3.1
This package is not auto-updated.
Last update: 2024-11-21 18:23:57 UTC
README
Модуль 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);
}
}
}