Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.04.2017 16:49:16

Каким образом правильно построить логику работы контроллера?

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;
    }

В данный момент все работает, интересует именно как сделать правильно.
Спасибо!

Не в сети

#2 02.04.2017 17:47:27

Re: Каким образом правильно построить логику работы контроллера?

Юзай транзакции

Не в сети

Подвал раздела