afagorn
@afagorn
Пытаюсь стать хорошим веб-программистом

Как лучше построить класс для обработки данных с постороннего API?

Приветствую. Разрабатываю вывод статистики для каждого сотрудника из CRM Bitrix. Требуется взять количество звонков, его продуктивность, сумму сделок и т.п.

Вопрос в том как сделать более удобные методы для обработки данных. У меня есть функция, которая запрашивает данные о звонках. При том запрос строится с помощью указания фильтров для API битрикс, например, CALL_DURATION > 20. И мне нужно получить в одном случае все звонки всех сотрудников, а в другом звонки только определенных пользователей(по их ID). Получается мне нужно указать несколько разных параметров фильтров для одной функции. Проблема в том, что в эту функцию приходится добавлять кучу аргументов: длительность звонка, дата выборки, айди юзеров, типа сортировки, пагинация
getCallsHistory($callDuration=0, $dateStart=0, $dateEnd=0, array $usersID=[], $sort=null, &$result = array(), $nextPagination=0);


Для большего удобства я подумал использовать один массив куда будут передаваться все параметры для фильтрации. Таким образом функция становится значительно чище в аргументах, но мне кажется что я не очень удобно строю этот массив фильтров. У меня никак не контролируется заполнение значений и названия ключей. Может есть какой-то более лучший способ создавать этот массив? Или может вообще идея с массивом плохая? Привожу ниже весь код

<?php
class bitrix24 extends BaseObject {

    //Как бы общая функция для выдачи звонков по разным фильтрам
    private static function getCallsHistorySource($filterData, &$result = array(), $nextPagination=0)
    {
        //Тут попытка создать дефолтные значения для фильтров
        $defaultFilterData = [
            'callDuration' => 0,
            'dateStart' => 0,
            'dateEnd' => 0,
            'usersID' => '',
            'sort' => 'CALL_START_DATE'
        ];
        $filterData = array_merge($defaultFilterData, $filterData);

        //Тут я уже формирую фильтр для запроса в битрикс
        $filter = array(
            ">=CALL_DURATION" => $filterData['callDuration'],
            "CALL_TYPE" => 1,
            ">CALL_START_DATE" => $filterData['dateStart'],
            "<CALL_START_DATE" => $filterData['dateEnd'],
            'PORTAL_USER_ID' => $filterData['usersID']
        );

        // Получаем данные
        $callsHistory = Yii::$app->bitrix24->Send("voximplant.statistic.get", 'POST', array(
            "FILTER"    => $filter,
            "SORT"      => $filterData['sort'],
            "ORDER"		=> "DESC",
            "start"		=> $nextPagination,
        ));

        // Рекурсией обрабатываем оставшившиеся данные
        if(isset($callsHistory['nextPagination']) && $callsHistory['nextPagination'] > 0) {
            self::getCallsHistorySource($filterData,$result, $callsHistory['nextPagination']);
        }

        return $callsHistory['result'];
    }

    //Это как бы обертка-функция. Хочется, чтобы было видно какие нужно указать аргументы и какие-то сделать обязательными
    //Фунукция для получения звонков по айди сотрудников
    public static function getCallsHistoryByUsersID(array $usersID, $callDuration=0, $dateStart=0, $dateEnd=0, $sort='')
    {
        //Вот тут я формирую массив для фильтрации запроса
        $filterData = [
            'usersID' => $usersID,
            'callDuration' => $callDuration,
            'dateStart' => $dateStart,
            'dateEnd' => $dateEnd,
            'sort' => $sort
        ];

        //Вызываю общую функцию
        return self::getCallsHistorySource($filterData);
    }

    //Тут тоже обертка-функция, но уже получаю все звонки по всем пользователям и с другой сортировкой
    public static function getCallsHistory($callDuration=0, $dateStart=0, $dateEnd=0, $sort='')
    {
        //Опять формирую массив фильтров
        $filterData = [
            'callDuration' => $callDuration,
            'dateStart' => $dateStart,
            'dateEnd' => $dateEnd,
            'sort' => $sort
        ];

        //Вызываю общую функцию
        return self::getCallsHistorySource($filterData);
    }

}


И дополнительный вопрос. Это нормально использовать такие функции обертки, чтобы сформировать разный прозрачный набор аргументов? А это ведь по сути можно просто в одну функцию передавать массив с разными фильтрами

Заранее благодарю за любые советы и критику
  • Вопрос задан
  • 353 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alexandrto
Я бы сделал через функцию Params и в которой возвращал массив параметров
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы