Рад приветствовать тебя, дорогой читатель!

В данной статье пойдет речь о новой библиотеке «ABI Model Pattern». Наверное, было бы логично предоставить какой-то пример, чтобы показать все возможности этой библиотеки, но вот и нетушки… Сейчас я опишу только достаточный минимум, чтобы познакомить тебя с ней, предоставить твоему воображению создать правильную картинку и использовать её для реализации всех идей, которые придут тебе в голову.

image

Если подумать, каким образом можно создавать необходимые модели и поддерживать соответствие данных оным? Возникает следующая мысль:

  • во-первых, нам нужно как-то физически описать модель, то есть понять, что это некоторая сущность, с которой можно взаимодействовать;
  • во-вторых, получить в конечном итоге нечто такое, с чем было бы удобно продолжать работу, не выходя за рамки функциональности этой модели.

image

Основные понятия


Добавлю в эту статью немного терминологии из данной библиотеки, так как в дальнейшем я буду называть всё словами, более подходящими для описания того, как всё работает.

  • Библиотека имеет свой графический интерфейс для удобства создания моделей, который сопровождается всплывающими окнами, предупреждениями и различными подсказками;
  • Модель — это описание, которое представляется набором параметров/полей, а параметры в свою очередь имеют определенные свойства;
  • Entity — это имплементация (инстанс) модели. Будем считать, что это объект хранящий данные, которые соответствуют требованиям модели.

Чтобы более ясно подчеркнуть слова выше, представлю страницу создания модели из интерфейса:

image

Таким образом, для того чтобы создать Модель, нам необходимо дать ей имя, наделить её параметрами и указать, каким требованиям должен соответствовать каждый из них.

Отдельно хочу отметить специальный чекбокс возле поля для ввода названия параметра. Этот чекбокс даёт возможность сделать связь между параметром и колонкой в базе данных, что стоит рассматривать как связь <Модель><Таблица>, а точнее <Параметр><Колонка>.

Я не буду углубляться в самые тонкие и глубинные места этой библиотеки (да, я действительно думаю, что у тебя найдётся время для чего-то более важного, чем читать то, что я здесь пытаюсь объяснить и бла-бла-бла), так как хочу объяснить только лишь смысл и предназначение. Одна из идей использования библиотеки представлена на картинке ниже.

image

Подводим итоги


Вот что мы имеем на сегодняшний день:

  • библиотеку, с помощью которой можно создавать модели (которые в дальнейшем будут храниться в … и будут валидироваться и парситься в … — я хочу, чтобы эта функциональность осталась скрытой в классах самой библиотеки как нечто что работает и не привлекает к себе дополнительного внимания);
  • entity, с которой ты сможешь работать, обновлять и получать значения, не думая о том, что в ней будут данные не соответствующие заявленным требованиям.

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

Если ещё проще, давайте рассмотрим, какие вы получаете возможности, подключая данную библиотеку:

  1. Простота создания, редактирования и удаления моделей в приложении при помощи интерфейса;
  2. Автоматическую валидацию по введенным свойствам для каждого параметра модели;
  3. Возможность автоматического создания таблиц и колонок в базе данных;
  4. Целостность данных в Entity;
  5. Простота использования Entity на базе созданной модели;
  6. Лёгкость в переносе библиотеки с сохранением всех моделей в другие проекты;
  7. Самодостаточное дополнение к любому проекту, которое не зависит от чего-либо стороннего для работы.

image

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

Ссылка на «ABI Model Pattern v.0.1.0 demo» в github

Благодарность


А прямо вот здесь, именно то самое лучшее место для того, что поблагодарить Дениса Гончарова (@denaikG), за очень многое: поддержку, помощь в разработке, а также реализацию интерфейса для библиотеки, с помощью которого появилась возможность управлять моделями.

Ваше мнение очень важно для понимания в каком направлении двигаться и, каков интерес вызван у вас, дорогих, к этой библиотеке. Критику, пожелания и комплименты оставляйте в комментариях.

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


  1. BoShurik
    06.02.2018 18:58

    Попытался поставить, но не заработало. Полагаю, потому что APIURL захардкожен (http://grigorov.com/abi/index.php)


    1. D-Grigorov Автор
      06.02.2018 19:30

      Добрый день, обязательно исправлю это в ближайшее время и залью изменение


  1. SerafimArts
    06.02.2018 21:30

    Немного не понял идею. Я так понимаю что идея просто в визуализации диаграммы классов? Тогда почему «библиотека», если завязка на полный http стек?

    Решил посмотреть код, разобраться. Понимаю, что посыл статьи не в «библиотеке», а в идее, но всё же…

    Чуть про исходники
    1) vendor в git не хранится никогда
    2) PSR-1/2/12 нету, что печалит
    3) vendor и все ситемные файлы доступны из под http, включая конфиги и прочее. Понимаю что демка, но это же основы безопасности.
    4) Синглтон, особенно для конфигов — это печально.
    5) Зачем делать require для functions.php, когда есть композер?
    6) Почему functions в глобальном пространстве и без проверок на существование?
    7) Ну и вообще: github.com/daniilgrigorovabi/abimodelpattern/blob/master/abi/src/classes/database/drivers/Mysql_Driver.php#L122

    Я бы просто постеснялся выкладывать подобные исходники, написанные по всем канонам того, как писать не стоит. Особенно метка goto на 256ой строке доставляет =))))


    1. D-Grigorov Автор
      06.02.2018 23:35

      Спасибо за ответ. Всё что касается доступности отдельных файлов/папок действительно есть недочёты. Composer был добавлен уже перед тем, как опубликовать демку для подключения классов. Зачем делать подключение function.php когда есть композер — это очень точное замечание, и оно меня заставило улыбнуться, много подключено вот только для того, чтобы работало, и я мог предоставить библиотеку в обозрение. А по поводу того, какая была идея добавлю, конечно, несколько слов.

      Созданные в модели параметры, имеют обязательный набор свойств. Значение, которое хранится в Entity обязательно соответствует всем вынесенным требованиям. К примеру, если вы указали, что в модели есть параметр «email», который обязателен, является строкой и не превышает 15 символов, и вы пытаетесь создать Entity на основе этой модели, вот передавайте что угодно, но пока значение не пройдёт эту валидацию, вы будете получать ошибку. Таким образом, мы получаем тот вид и набор данных, который нам нужен, не какой-либо другой, другой не годится. Кроме вот этой идеи, ещё воплощено то, что мы можем связать модель и таблицу в БД (а таблица и колонки будут созданы вместе с моделью в интерфейсе). Мы таким образом сводим к минимуму дополнительные проверки всех данных и знаем какие параметры должны быть записаны в базу, а какие нет.

      Ещё пример, вызываем какой-либо API метод, и в ответе ждём параметр «token» (обязателен, строка, ...), и создаём определённую модель для того, чтобы из полученного ответа создать конкретную Entity, если Entity создалась успешно, значит и значения в ней точно верны, ну а если нет, то одной из причин может быть то, что в теле ответа нет совсем параметра «token», а может быть значение пришло null…

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

      Все ваши замечания приняты во внимание. Спасибо!


      1. SerafimArts
        07.02.2018 05:12

        Хм, т.е. грубо говоря — это некая CMS для ECS?


        1. SerafimArts
          07.02.2018 05:20

          Хотя нет, глупость сказал. В ECS поведения накидываются извне и не отображают предметную область. А тут просто редактор моделей.

          Т.е. из плюсов — визвиг редактор всего. Из минусов — всё равно придётся в код лезть, т.к. в таком виде они представляют из себя обычные анемичные модели, или даже DAO с инвариантами. Хм, получается в этом и задумка? Обычный редактор DAO записей в БД?


          1. D-Grigorov Автор
            07.02.2018 12:41

            Библиотека совсем несвязана с тем, чтобы управлять данными пользователя, ну по крайней мере сейчас. То есть, функционал библиотеки завязан лишь на том, чтобы хранить структуру всего. А значения, которые вы получаете в Entity, они никак не изменяются, только лишь проходят все проверки, дальше Entity данные никуда не проникнут, только если вы их оттуда вытащите. Безусловно, сейчас в код нужно лезть, но ведь в рамках этой демки, хочу показать то, что вы в коде, имеете верные данные, Вы не добавляете массу дополнительных условий чтобы проверить каждое значение и не пишите циклы для этого (А то что в базе хранится структура, только даёт возможность вам быть уверенным в том, что структура модельки и базы совпадают, и править это можно удобно в одном месте, в интерфейсе).


  1. bashkarev
    06.02.2018 23:08

    Это уже было в симпсонах битриксе


    Слабые стороны:


    • Нет версионности, миграций как таковых.
    • Легко потерять данные.
    • Классы фактически не генерируются, атрибутов не будет в autocomplete idea, a c php 56 даже не будут проверяться на isset/empty
    • psr/тесты...

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


    1. D-Grigorov Автор
      06.02.2018 23:08

      Принял во внимание, спасибо.


  1. michael_vostrikov
    07.02.2018 09:30

    У меня есть критика, только я вам ее не скажу. Предоставляю вашему воображению создать правильную картинку.


  1. michael_vostrikov
    07.02.2018 13:22

    index.php


    foreach($_POST as $function_name => $parameters) {
        if (function_exists($function_name)) {
            $result = $function_name($parameters);
            ...

    Жесть какая) Спрячьте эту поделку и не показывайте никому.