Описание системы
DVelum - платформа профессиональной web-разработки. PHP + ExtJS.
DVelum - платформа быстрой разработки, основанная на фреймворке ExtJS и PHP + MySQL на стороне сервера. Возможности платформы позволяют за несколько минут создать рабочее приложение без использования запутанных файлов конфигураций, все настройки производятся в визуальных интерфейсах. Автоматически сгенерированные интерфейсы легко модифицировать при помощи встроенного дизайнера.
Платформа может использоваться как для быстрого прототипирования так и для создания бизнес приложений, бэкофисов, интерфейсов управления данными.
Основные компоненты системы:
- легковесная ORM с визуальным интерфейсом управления;
- автогенератор кода с возможностью изменения шаблонов автогенерации;
- дизайнер интерфейсов со встроенным редактором кода;
Так же в платформу интегрирован PSR-0 совместимый автозагрузчик классов, что позволяет без труда интегрировать готовый функционал и библиотеки.
Высочайшая производительность и гибкие настройки, широкий набор компонент и возможностей, облегчающих разработку.
Это не очередная cms или framework, это платформа для разработки систем со сложной внутренней структурой, таких как eCommerce, CRM, WebScada, Автоматизированных Рабочих Мест, хотя разработка простых сайтов на ней так же легка и приятна.
Основные концепции проекта:
- максимальная автоматизация разработки;
- использование визуальных интерфейсов при разработке.
- максимальная производительность;
Системные требования
- Linux (при запуске под windows возможны проблемы, ведем работы над совместимостью);
- PHP 5.3 и выше;
- Mysql 5.1 и выше;
- веб-сервер Apache + mod_rewrite / Nginx;
- желательно наличие memcached и опкод кэшера.
Платформа представляет собой программный комплекс, состоящий из библиотек, приложений и веб-интерфейсов к ним.
Платформа работает в двух режимах:
- production-система;
- система разработки.
На данный момент платформа имеет три интерфейса:
- публичная часть;
- административная часть;
- интерфейс разработчика.
Режимы работы отличаются по набору возможностей и конфигурации производительности.
Предусмотрена возможность смены языка интерфейса.
Функционал
Панель администрирования на ExtJS
Режим разработчика:
- визуальный интерфейс управления ORM (и сама ORM соответственно);
- модуль анализа структуры БД с возможностью синхронизации со структурой ORM, импорт таблицы БД в ORM;
- отображение связей объектов ORM в виде интерактивной UML-диаграммы;
- возможность задания описания объектов ORM на разных языках (мультиязычность ORM);
- Designer / IDE (визуальный редактор/конструктор интерфейсов, редактор кода бизнес-логики интерфейсов);
- набор готовых ExtJS компонент;
- PHP обертка над библиотекой ExtJS;
- набор готовых контроллеров CRUD с поддержкой контроля версий;
- Deploy-модуль, анализ файловой структуры удаленных серверов, сборщик пакетов обновлений, монитор удаленной ORM;
- система кэширования, включающая расширяемый набор триггеров для сброса кэша по событию;
- визуальный интерфейс сборки кода в пакеты (повышение производительности);
- PSR-0 совместимый Аutoloader с поддержкой карт классов и пакетов;
- инструментарий подготовки пакетов кода, карт классов, пересборки локализаций JS, включает индикаторы необходимости пересборки;
- интерфейс управления модулями административной части;
- интерфейс управления модулями публичной части;
- библиотека для реализации фоновых задач;
- высокопроизводительная библиотека для работы с древовидными структурами;
- интерфейс управления словарями-списками;
- иерархия моделей для быстрой выборки данных из БД, минуя ORM;
- scaffolding, автоматическое создание простых CRUD-контроллеров и интерфейсов редактирования данных объекта (автоматически создается контроллер, необходимые записи роутинга, права для администратора, проект интерфейса Designer);
- поддержка классов из библиотек Zend Framework.
Режим администратора системы:
- управление пользователями;
- управление группами пользователей;
- система контроля версий и публикации;
- управление древовидной структурой публичной части системы;
- медиатека (интерфейс управления мультимедиа архивом);
- история изменений объектов ORM;
- конструктор меню;
- конструктор блочной структуры;
- визуальный конструктор отчетов на основе данных ORM;
- просмотр и управление фоновыми задачами;
- интерфейс пакетной перенарезки изображений.
- новости (в качестве Demo);
- статьи (в качестве Demo);
- управление топиками (в качестве Demo);
Публичная портальная составляющая
- страницы;
- новости;
- блочная структура;
- темизация;
- блоки для различных модулей (новости, страницы, статьи, меню, статичные, блоки, топики).
Публичная портальная составляющая включает пока небольшой набор готовых решений, демонстрирующий примеры работы с системой.
Рабочий цикл создания приложения
- При помощи визуального интерфейса управления ORM (объектно реляционное представления) создаются объекты базы данных, определяются их свойства (поля), взаимосвязь.
- При помощи автогенератора кода расположенного в разделе управления модулями административной панели генерируются необходимые контроллеры и проекты интерфейса (одним кликом).
- При помощи визуального редактора дорабатывается визуальный интерфейс управления созданными объектами (при необходимости). Там же добавляется недостающая бизнес логика вашего приложения (JS + ExtJS). При необходимости создаются дополнительные контроллеры и модели.
- В интерфейсе управления пользователями назначаются права доступа.
- Создается публичная составляющая вашего приложения, изменяется дизайн. Для публичной части уже готовы некоторые интерфейсы управления.
Особенности системы
Панель администрирования на ExtJS4
Фреймворк ExtJS - очень гибкий и мощный инструмент для разработки интерфейсов.
Если вы еще не знакомы с ExtJS, самое время начать его изучение.
Введение: http://www.sencha.com/products/extjs/
Обзор виджетов: http://www.sencha.com/products/extjs/examples/
Ресурсы для изучения: http://www.sencha.com/learn/extjs/?4x
Документация: http://docs.sencha.com/ext-js/4-0/
Базовая система кэширования
Платформа разрабатывается с учетом необходимости кэширования данных. Кэш может быть разделен на необходимое вам количество типов. Для каждого типа кэша имеется отдельное хранилище, которое в свою очередь может работать с разными типами бэкендов. На данный момент из коробки поддерживается кэш в memcached и APC.
PSR-0 Autoloader с поддержкой Class Map, Сode Packages, Code compiler
Связка autoloader + code compiler + class map + code packages прилично ускоряет автозагрузку классов и производительность системы в целом. Autoloader использует карты классов и пакетов (генерируются автоматически) для поиска и загрузки классов. Пакеты представляют собой файлы с собранным исходным кодом связанных классов.
Code compiler позволяет формировать Code Packages (очень актуально при разрастании системы).
Разработчик определяет, какие библиотеки и классы системы используются постоянно или в группе, исходя из этого создает упаковки кода, содержащие наборы классов. Одним нажатием клавиши пакеты собираются из исходных кодов, в этот же момент создается карта классов для Autoloader. Не нужно писать собственных скриптов, собирающих весь код в один файл, это не всегда целесообразно. Загружается только то, что нужно, в необходимом объеме, позволяя с одной стороны уменьшить количество дорогостоящих операций require, с другой стороны сэкономить оперативную память и процессорное время.
При запросе класса Autoloader в первую очередь ищет его по карте (hash), определяет местоположение в файловой системе и причастность к какому либо Package. Если класс включен в состав сборки, подключается весь пакет, иначе подключается отдельный файл. Если класса не оказалось в карте (например, она устарела), Autoloader ищет файл класса в файловой системе по заданным путям.
Такой подход позволяет многократно повысить производительность системы, ограничивает избыток вгруженного кода.
Ниже представлена история тестов производительности системы на функциональности «Блог» (тестировалось обращение к главной странице блога, содержащего 10 записей) и «Главная страница» с memcached в различных версиях DVelum:
Во время разработки мы уделяем большое внимание трассировке и профайлингу кода, что позволяет находить "медленные" конструкции и оптимизировать их. Подробное описание возможностей оптимизации производительности платформы в разделе «Производительность системы».
ORM
Система включает ORM с интуитивным визуальным интерфейсом управления. Не нужно писать файлов конфигурации объектов, все делается средствами интерфейса.
Чем интересна ORM:
- удобным интерфейсом управления;
- умением анализировать структуры таблиц, делать импорт таблицы из другой базы данных и проекта;
- возможностью делать резервные копии структуры и данных (пока ограничено localhost);
- конфигурация объектов лежит в файлах, что позволяет с легкостью переносить их с сервера на сервер, если структура объекта отличается от структуры его реляционного представления, система предупреждает о несоответствии, одним кликом можно синхронизировать структуру реляционного представления, таким образом ее проще хранить в том же SVN;
- поддерживает несколько MySQL storage engine: memory , myisam , innodb;
- соответственно по разному обрабатывает изменения данных объектов (автоматически использует транзакции при их доступности);
- производит валидацию данных перед изменением, поддерживает ссылки на объекты и списки объектов, словари - списки (не путать с ENUM);
- позволяет создавать индексы;
- поддерживает механизм контроля версий, интегрированный в систему;
- поддерживает логгирование изменений;
- возможно добавление своих валидаторов данных;
- ссылочная целостность валидируется независимо от Storage Engine;
- мультиязычность наименований (для каждого языка могут быть определены свои наименования);
- поддержка Foreign Keys;
- позволяет подключать таблицы сторонних баз данных, импортировать структуру объектов.
Концепция ORM достаточно простая, использован подход Concrete Table Inheritance, когда таблица содержит все свойства описываемого класса. Мы сознательно отказались от реализации наследования объектов ORM в пользу простоты, производительности и перспектив внедрения горизонтального шардинга. Остальные подходы если не исключают, то очень сильно усложняют масштабирование. Архитектурный концепт кардинально отличается от подхода таких систем как Doctrine.
Работа с данными происходит в двух плоскостях:
- создание, изменение, удаление – через ORM;
- выборка через модели.
Совмещение двух подходов позволяет минимизировать недостатки концепта работы с данными средствами ORM. С одной стороны повышается производительность выборок, появляется возможность организовать прозрачное кэширование данных, инвалидировать кэш. С другой стороны позволяет обеспечить целостность и валидность данных.
Доступ ко всем объектам производится при помощи класса Db_Object
$news = new Db_Object('news);
$news->title = “Новость 1”;
$news->text = “Содержание новости”;
$news->news_date = date('Y-m-d');
$news ->save();
Обращаем ваше внимание на то, что по механизму это не просто задание любых свойств объекта, состав и тип свойств жестко регламентируется интерфейсом управления ORM. При недопустимых действиях разработчик информируется об ошибке.
Основное отличие от Doctrine - нет необходимости писать PHP-код для описания объектов, наследовать их от базовых классов, как следствие Db_Object не может реализовать частное поведение объекта, поведение описывает модель или дополнительный класс. Связи объектов описываются средствами интерфейса.
Подробное описание работы с ORM в разделе «Интерфейс управления ORM».
Динамические модели для ORM
При отсутствии модели (Model) для конкретного объекта инстанцируется виртуальная модель, реализующая базовый функционал работы с данными (получение списка объектов по условиям, фильтрам, поисковому запросу, подсчет количества объектов, пейджер и многое другое). Также возможно определение реальных классов отнаследованных от Model и расширяющих ее функциональность. Подробное описание моделей ORM в разделе «ORM и Модели».
Интерактивная UML-диаграмма связей объектов ORM
Система строит интерактивную диаграмму связей объектов ORM, которая поможет вам быстро сориентироваться в структуре данных.
Управление кодом, JS – подключение, сборка, кэширование
Реализована система управления JS-кодом – сборка, кэширование, минификация, вывод.
Sharding
Начиная с версии 2.0 платформа поддерживает горизонтальное масштабирование ORM из коробки.
Масштабирование осуществляется за счет разнесения данных по нескольким серверам баз данных.
Система включает в себя 4 готовых варианта шардирования ORM объектов, не сложно добавить свои.
Количество шардов не ограничено, есть возможность указать вес и группу шарда. Поддерживаются правила роутинга.
Подробнее про шардинг
Конструктор отчетов (0.9.x)
Интерфейс построения отчетов по данным ORM позволяет при помощи визуального интерфейса формировать выборки данных, возможен экспорт.
Подробнее о конструкторе отчетов в разделе «Описание отчетов».
Медиатека
Мадиатека – хранилище мультимедийного контента и файлов, удобный поиск, загрузка/мульти-загрузка и редактирование, автоматическая и ручная нарезка изображений.
Автоматическая нарезка осуществляется при загрузке изображения, можно указать количество и размеры необходимых превью, а так же метод нарезки. Возможна простая нарезка при помощи уменьшения или подгонка под жестко указанные размеры без потери пропорции. Загружаемые файлы раскладываются по папкам, превью получают постфикс в соответствии с конфигурацией (механизм получения адреса превью определенного размера реализован).
Media Library снабжена двумя загрузчиками файлов, поддерживает мультизагрузку.
После того как сформирована медиатека изображения можно крепить к другим системным объектам и вставлять в визивик.
Не редки случаи изменения дизайна веб-проекта, добавления новых элементов, изменения размеров, это требует корректировки размеров превью.
Система позволяет запускать фоновые задачи по перенарезке изображений в различных режимах:
- все изображения;
- изображения, которые не были нарезаны вручную при помощи интерфейса crop;
- изображения определенных размеров.
Процесс выполнения отображается в интерфейсе администратора, более того, его можно приостанавливать, отключать, запускать, не боясь перезагрузить страницу. Подробнее о Медиатеке в разделе «Описание раздела Медиатека».
Фоновые задания
Реализован механизм запуска фоновых заданий с возможностью интерактивного взаимодействия. Ход выполнения задания и основные параметры процесса отображаются в интерфейсе администрирования. Задачи можно приостанавливать, отключать, запускать, отправлять им сигналы. Перезагрузка страницы не влияет на работоспособность задания.
Пока реализован самый простой подход - запуск при помощи AJAX-запроса на сервер в режиме ignore user abort. Позже будет реализован натуральный fork процесса при помощи PCNTL.
Контроль версий Данных
В систему интегрирован механизм контроля версий данных, который подключается для конкретных объектов ORM.
Объекты такого типа:
- содержат дополнительные системные поля;
- публикуются (отслеживается версия опубликованных данных);
- возвращаются в состояние определенной версии;
- позволяют просматривать версии.
До публикации объекта, его редактирование не несет никаких изменений в публичной части, что в некоторых случаях очень удобно (публикация статей, веб-страниц, документов). Ссылки на объекты и списки объектов так же участвуют в версионном контроле, в интерфейсе отображается состояние связанных объектов.
Реализована возможность предпросмотра публикуемых данных в публичном интерфейсе, в рамках реальной темы оформления.
Разграничение прав доступа
Как и в большинстве систем имеется механизм разграничения прав доступа для пользователя / группы пользователей к различным разделам системы (права на просмотр, редактирование, удаление и публикацию в случае использования контроля версий). Подробнее о разграничении прав доступа в разделе «Описание раздела Пользователи».
Управление древовидной структурой публичной части системы
Удобный инструментарий реализует управление древовидной структурой drug&drop, контроль версий и многие другие функциональности (предварительный просмотр страниц, менеджер блоков, компонент добавления связанных сущностей и др.). Подробнее об управлении структурой страниц в разделе «Описание раздела Страницы».
Менеджер блоков
Интерфейс распределения блоков на странице поддерживает drug&drop, различные варианты расположения и неограниченное количество контейнеров. Структура расположения блоков определяется в теме оформления несложным файлом конфигурации (похож на верстку таблицы, возможно в будущем будет заменен на визуальный интерфейс). Интерфейс подхватывает структуру блоков, которую предоставляет на модерацию администраторам. Подробнее о менеджере блоков в разделе «Описание раздела Блоки».
Пример файла конфигурации:
return array( 'columns'=>3, 'items'=>array( 'b1'=>array( 'colspan'=>3, 'container'=>false, 'width'=>600, 'height'=>80, 'html'=>'Header' ), 'leftblock'=>array( 'container'=>true, 'width'=>150, 'height'=>300 ), 'b3'=>array( 'container'=>false, 'dataArea'=>true, 'width'=>300, 'height'=>300, 'html'=>'Main content' ), 'rightblock'=>array( 'container'=>true, 'width'=>150, 'height'=>300 ), 'b5'=>array( 'colspan'=>3, 'container'=>false, 'width'=>600, 'height'=>80, 'html'=>'footer' ) ) );
Поддержка тем
Для каждой страницы публичного интерфейса можно указать собственную тему и расположение блоков.
Конструктор меню
Удобный интерфейс построения меню позволяет создавать и редактировать древовидную структуру меню, при этом самих меню может быть создано неограниченное количество, они могут быть выведены в шаблонах, так же можно создать для каждого меню блок и вывести его на любые страницы. Подробнее о конструкторе меню в разделе «Описание раздела Меню».
Менеджер событий, триггеры
В определенный момент возник вопрос инвалидации кэша. Для этого был реализован менеджер событий, по реализации больше похожий на менеджер триггеров. Хранилище объектов перед операциями отправляет событие в менеджер, который проверяет наличие триггеров на это событие.
Встроенная IDE, Дизайнер интерфейсов
Полным ходом идет разработка встроенной IDE, которая позволит повысить производительность разработки интерфейсов. Какому профессиональному разработчику PHP не хотелось иметь визуальную среду разработки аналогичную MSVisual Studio / Borland C++ builder / CODEGEAR RAD Studio?
Что же это за система Dvelum IDE и чем она отличается от аналогов?
Визуальный редактор интерфейсов примечателен тем, что интегрирован в систему, это позволяет еще больше автоматизировать разработку. Так же интерфейс имеет возможность расширения функционала на основе именно вашего приложения, чего нет у аналогов. Интерфейс тесно интегрирован с ORM, может анализировать структуру базы данных и на ее основе создавать формы и таблицы.
Вы с легкостью можете писать свои дополнительные компоненты и виджеты.
Разрабатываемый интерфейс сразу же можно смотреть и тестировать в окне редактора, на данном этапе поддерживается возможность изменения размера окон, ширины и позиции колонок грида путем drug&drop в области просмотра результата. Остальные возможности реализуются путем взаимодействия с компонентами среды разработки, в том числе и drug&drop.
Для формирования url адресов используется компонент, анализирующий код платформы и предлагающий выбрать Controller и Action, который сам формирует путь запроса (при отключенном байткод кэшере отображаются комментарии к коду) и многие другие мелочи, которых не может быть в средах подобных Ext Architect.
На данный момент в IDE интегрирован визуальный редактор кода JS , возможность подключения внешних JS-файлов, подключение вложенных проектов.
Хотелось бы обратить внимание, что добавление нового административного модуля (позже будет реализована возможность для клиентского модуля) в проект при желании может осуществляться одним кликом, это значительно упрощает разработку. Раздел Backend Modules -> создать интерфейс. Создается готовый CRUD-интерфейс, который можно изменить на свое усмотрение.
Использование IDE не является обязательным, при разработке можно обойтись собственными силами, самостоятельно описывать контроллеры и создавать проекты интерфейсов.
В отличие от предыдущей версии системы, путем многочисленных оптимизаций удалось добиться десятикратного прироста производительности генератора кода, сейчас сложный интерфейс генерируется за 0,2 секунды. Не стоит забывать, что генерация происходит лишь при первом обращении, следующие обращения занимают 0,02 секунды. Возможно добиться большей производительности включением встроенного механизма кэширования в memcached (0,01с). Мы и сейчас не останавливаем работы по повышению производительности кодогенератора и системы в целом. Подробнее о встроенной IDE в разделе «IDE Часть I: Основные элементы».
Scaffolding
При помощи пары кликов в разделе управления модулями административного интерфейса можно создать стандартный CRUD-интерфейс управления данными объекта. Автоматически создается Controller, добавляются записи в файлы конфигурации, регистрируется Route, назначаются права доступа для администратора, создается проект интерфейса Designer. Cоздав модуль по клику, можно отвлечься от рутинных операций по созданию стандартного функционала, заняться кастомизацией интерфейса. Процесс создания приложения показан в скринкасте «Создание простого web-приложения (телефонная книга за 10 минут без использования программирования)», а также описан в разделе «Создание простого web-приложения (телефонная книга за 10 минут без использования программирования)».
Deployment (0.9.x)
Не могли оставить без внимания столь важную тему, как публикация изменений на production-сервер. Был разработан модуль автоматизации публикации, который сейчас распространяется с ограниченной функциональностью, к следующим версиям она будет расширена.
Deployment помимо инструментария сборки пакетов обновлений представляет собой монитор состояния удаленных серверов, с его помощью можно идентифицировать поврежденные и инфицированные файлы. Модуль имеет системные ограничения, работает только на Linux, так же требует установку библиотек php_curl и php_zip.
Deployment-модуль можно использовать как инструмент мониторинга вмешательства в код (думаю, многим знакома проблема взлома сервера и вставки вредоносного кода). Подробнее о модуле Deployment в разделе «Описание компонента Deployment (сборка и публикация пакетов обновления, мониторинг)».