ABI Model Pattern – библиотека с графическим интерфейсом, предназначенная для инициализации моделей, свойств моделей, а также для определения набора правил для каждого свойства. Созданные модели необходимы для хранения «структуры» данных, ограничения целостности и простоты изменения условий для их верификации. Все настройки необходимые для работы библиотеки хранятся в отдельном конфигурационном файле, база данных используется только в случае биндинга моделей для создания схемы при необходимости. Функциональность для связывания модели с базой данных будет описана ниже.



Два раза меня спрашивали: «Скажите, м-р Бэббидж, а если вы введёте в машину неправильные данные, получится ли правильный ответ?». Непостижима та путаница в головах, которая приводит к таким вопросам.

Чарльз Бэббидж, «Отрывки из жизни философа» (1864)


Графический интерфейс необходим для удобства создания моделей без дополнительного изучения логики библиотеки, а также для валидации действий пользователя во время определения набора правил для свойств модели, динамически изменяя форму создания и отображая соответствующие ошибки. Настройки логгера и подключения к базе данных.

Для создания модели в интерфейсе библиотеки необходимо определить её свойства и условия верификации данных для этих свойств. Класс библиотеки Validator сопоставляет данные каждого входного параметра с условиями свойства указанной модели для формирования Entity, и в случае возникновения несоответствия — завершает работу с определённой ошибкой.

Сформированная модель (Entity) — это объект с выдержанным набором свойств, который хранит данные переданные для его создания. Каждое свойство может быть обязательным и не обязательным.

  1. Данные для обязательного свойства должны быть переданы для формирования Entity;
  2. Не обязательное свойство хранит данные указанные по умолчанию, если данные для этого свойства небыли переданы.

Так как каждая Entity является экземпляром соответствующего типа, оператор instanceof может быть использован для проверки её принадлежности указанному типу.

Каждая созданная модель является новым типом, который можно использовать при создании следующих свойств модели. Пользовательский тип можно использовать как тип свойства, так и в коллекции типа. Простым примером является модель “Coupon” как тип свойства в модели «Order».

Модель «Coupon»:




Модель «Order»:




Коллекцию типа можно использовать в случае неизвестного количества элементов в массиве или объекте. Данные каждого элемента такой структуры данных должны соответствовать условиям созданной модели, которая используется в качестве типа свойства. Пример коллекции типа можно рассмотреть следующим образом:
Корзина покупателя может хранить неизвестное количество продукции. В модель «Order» добавим свойство «Products» с типом «Массив» и коллекцией типа «Product». Каждый элемент такой структуры данных должен соответствовать типу «Product».

Модель «Product»:




Модель «Order»:




Для связывания модели с базой данных необходимо установить флажок «bind_db» для каждого или отдельных свойств на страницах Создания/Редактирования модели. Название таблицы соответствует названию модели и колонки этой таблицы соответствуют связанным свойствам модели, включая указанный для них набор правил. Структура связанных таблиц с моделями изменяется, если в модель вносятся изменения.

Пример связанной модели «Order» в базе



Перед тем как связать модель и её свойства с базой данных, необходимо настроить подключение к базе данных в интерфейсе библиотеки на соответствующей странице.

В текущей версии библиотеки есть возможность использовать только MySQL базу данных и ограниченный набор MySQL типов.

В данной библиотеке отсутствует функциональность для записи Entity в базу данных, а также удаление записей. Создавая такую пользовательскую функциональность, обратите внимание, что при изменении свойств модели, связанных с базой данных — будет изменяться структура таблицы, а при удалении модели – удаление таблицы.

Для использования логгера необходимо его включить и настроить в отдельной странице интерфейса библиотеки.

Создавайте модели для всех параметров функций, коллекций данных, запросов, ответов запросов и прочих необходимых параметров для проверки данных. Это необходимо для исключения неожиданных ошибок во время выполнения приложения и повышения контроля данных для их дальнейшей обработки.

Класс библиотеки Parser необходим для перебора входных параметров в переданной коллекции для создания Entity. Parser перебирает и находит в переданной коллекции только те параметры, которые необходимы для создания Entity. Перебор параметров выполняется не рекурсивно. Пример получения данных в private24 API и создания Entity модели «ATM».

Модель «atm»:




Модель «atmdevice»:



Private24 API request URL:

api.privatbank.ua/p24api/infrastructure?json&atm&address=&city=%D0%96%D0%BE%D0%BB%D0%BA%D0%B2%D0%B0

Private24 API response:

response
{
   "city":"Жолква",
   "address":"",
   "devices":[
      {
         "type":"ATM",
         "cityRU":"Жолква",
         "cityUA":"Жовква",
         "cityEN":"Zhovkva",
         "fullAddressRu":"Украина,область Львовская,район Жолковский,город Жолква,улица Львовская,дом 1",
         "fullAddressUa":"Украiна,область Львiвська,район Жовкiвський,мiсто Жовква,вулиця Львiвська,будинок 1",
         "fullAddressEn":"Ukraine,area Lvivska,district Zhovkivskyi,city Zhovkva,building 1",
         "placeRu":"Универмаг \"Ботар\"",
         "placeUa":"Унiвермаг \"Ботар\"",
         "latitude":"50.056405",
         "longitude":"23.972725",
         "tw":{
            "mon":"09:00 - 18:00",
            "tue":"09:00 - 18:00",
            "wed":"09:00 - 18:00",
            "thu":"09:00 - 18:00",
            "fri":"09:00 - 18:00",
            "sat":"09:00 - 16:00",
            "sun":"00:00 - 00:00",
            "hol":"00:00 - 00:00"
         }
      },
      {
         "type":"ATM",
         "cityRU":"Жолква",
         "cityUA":"Жовква",
         "cityEN":"Zhovkva",
         "fullAddressRu":"Украина,область Львовская,район Жолковский,город Жолква,улица Львовская,дом 33",
         "fullAddressUa":"Украiна,область Львiвська,район Жовкiвський,мiсто Жовква,вулиця Львiвська,будинок 33",
         "fullAddressEn":"Ukraine,area Lvivska,district Zhovkivskyi,city Zhovkva,building 33",
         "placeRu":"Магазин \"Универсам\"",
         "placeUa":"Магазин \"Унiверсам\"",
         "latitude":"50.055840",
         "longitude":"23.981580",
         "tw":{
            "mon":"09:00 - 18:00",
            "tue":"09:00 - 18:00",
            "wed":"09:00 - 18:00",
            "thu":"09:00 - 18:00",
            "fri":"09:00 - 18:00",
            "sat":"09:00 - 16:00",
            "sun":"00:00 - 00:00",
            "hol":"00:00 - 00:00"
         }
      }
   ]
}


Создание Entity:

try {
// Include the composer autoloader
require_once('PATH_TO_ABI_LIBRARY/abi/vendor/autoload.php');

$prv24_atms_url = 'https://api.privatbank.ua/p24api/infrastructure?json&atm&address=&city=%D0%96%D0%BE%D0%BB%D0%BA%D0%B2%D0%B0';
    
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $prv24_atms_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$prv24_response = curl_exec($ch);
curl_close($ch);

$request_body = json_decode($prv24_response);
$available_atms = \ABI\classes\Entity::getEntity($request_body, 'atm');



$atm_devices = $available_atms->devices;



} catch (Exception $e) {
$error_message = $e->getMessage();
}

Добавим строку для удаления «devices» из переменной "$request_body" инициировав один из возможных не подходящих ответов:

unset($request_body->devices);

В свойство «devices» созданной ранее модели «ATM» было установлено правило «required». Удалив «devices» из "$request_body", ещё раз создаём Entity и получаем такую ошибку:



Последние зарегистрированные ошибки классом Logger добавлены на соответствующую страницу в интерфейсе. Выглядит это следующим образом:



Установка библиотеки


  1. Скачайте последнюю версию библиотеки
  2. Распакуйте загруженный архив в директорию, где вы хотите установить библиотеку.
  3. Чтобы установить зависимости для этой библиотеки, запустите команду установки из директории «abi» библиотеки — «composer install»
  4. Обязательно включите Apache модуль mod_rewrite и проверьте, чтобы ваш виртуальный хост был настроен с параметром AllowOverride.
  5. Проверьте и при необходимости установите атрибуты для конфигурационного файла библиотеки с правом на чтение и запись (0666).
  6. После установки библиотеки используйте имя пользователя — admin и пароль — admin для входа в графический интерфейс библиотеки.

> Ссылка на репозиторий

Большое спасибо за помощь и поддержку denaikG

Комментарии (4)


  1. SerafimArts
    11.07.2018 15:41

    По сравнению с прошлой статьей — эта стала значительно лучше. Теперь стало понятно что это за инструмент и зачем он нужен. Тут бесспорно — отличная работа.

    С другой стороны — старые замечания по коду остаются теми же. Инструмент с подобным уровнем качества и отсутствием тестов вряд ли может заинтересовать кого-то. Я понимаю, что это beta и все дела, но всё же имеет смысл сосредоточиться непосредственно на этом. Получше ознакомиться с PHP, архитектурой ПО, решениям безопасности (ну, например, не класть исходники в паблик директорию), а в частности — ознакомиться с travis, styleci, scrutiniser, phpstan и проч. Что думаете?


    1. D-Grigorov Автор
      11.07.2018 15:43

      Ого, Кирилл, большое спасибо. Да, конечно, почитаю. Прошлый ответ — «Я понимаю что демо», сейчас — «я понимаю что бета» =)


      1. SerafimArts
        11.07.2018 15:56

        Ну нельзя просто так критиковать без этой оговорки, иначе наверняка будут соответствующие отмазки.


        1. D-Grigorov Автор
          11.07.2018 16:01

          Критика принята, отмазкам здесь нет места)