Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Laravel Framework 5.4.11
PHP 7.0.14-2+deb.sury.org~xenial+1
Zend OPcache v7.0.14-2+deb.sury.org~xenial+1
Centos 7
MySQL 5.5.54-0+deb8u1
Apache/2.4.10 (Debian)
Здравствуйте!
Для решения задачи привожу структуру взаимодействия контроллеров и бд:
Контроллер (получение входных данных и передача в бизнес-слой) -> слой бизнес-логики (все действия над входными данными и запросы к модели) -> модель
Итак, стоит задача: при создании нового объекта сущности (методы которой находятся в контроллере) создавать 2 соответствующие записи в других БД.
Конкретно - имеется контроллер OfficeNumbers, при создании нового создать запись в БД asterisk и kamailio.
Сейчас делаю так:
в контроллере делаю
1.запрос на создание записи
2.запрос на создание записи в бд asterisk и kamailio
В бизнес-слое:
1. подключаю модели таблиц бд asterisk и kamailio, providers
2. Получаю список необходимых параметров из модели providers
3. Делаю необходимые вычисления и записываю данные через модель в бд asterisk и kamailio
Вопрос: как грамотно сделать так, чтобы при возникновении проблем с добавлением в одну из таблиц отменялись изменения во всех затронутых таблицах и вообще уместны ли такие действия?
То есть, понимаю, что нужно использовать транзакции, но нашел примеры с использованием транзакций при запросах непосредственно напрямую к БД. Притом интересует, правильно ли разделил действия, либо нужно было в контроллере выполнить один запрос на создание данных, а уже внутри этого запроса делать вставку записей в asterisk и kamailio
В контроллере:
$arUpdate = Array(
// какие-то поля
);
if (!$arResult['id'] = $this->businessLayer->getIdFromUpdate($arUpdate))
{
throw new ApiException("Error INSERT OfficeNumber");
}
if (!$arResult['insert_to_asterisk'] = $this->businessLayer->getIdFromUpdateOffNum($arUpdate))
{
throw new ApiException("Error INSERT OfficeNumber to asterisk/kamailio");
}
В бизнес-слое:
public function getIdFromUpdateOffNum($arUpdate)
{
$providers_model = new ProvidersModel();
$providers_repository= new ProvidersRepository($providers_model);
$asterisk_model = new AsteriskSipfriendsModel();
$asterisk_repository = new AsteriskSipfriendsRepository($asterisk_model);
$kamailio_model = new KamailioUacRegsModel();
$kamailio_repository = new KamailioUacRegsRepository($kamailio_model);
if (count($arProviders = $providers_repository->getById($arUpdate['provider_id']))) {
$arParameters = json_decode($arProviders['config'], true);
if ($asterisk_repository->getIdFromUpdate($arParameters))
{
if ($arProviders['require_reg'] == 'yes') {
$arCamailioUpdate = Array(
//какие-то параметры
);
return $kamailio_repository->getIdFromUpdate($arCamailioUpdate);
}
return true;
}
return false;
}
return false;
}
В данный момент все работает, интересует именно как сделать правильно.
Спасибо!
Не в сети
Юзай транзакции
Не в сети