Выбрав ReadyScript в качестве платформы для веб-приложений, разработчикам открываются богатые возможности одноименного фреймворка, составляющего ядро ReadyScript. Некоторые из этих возможностей будут описаны в данной статье.
Одной из особенностей системы ReadyScript является жесткая структура, что представляет собой набор зарезервированных имен директорий и файлов, в которых система ожидает данные определенного содержания.
Например, так выглядит корневая структура директорий ReadyScript:
- cache
- core
- rs //Фреймворк. Ядро сайта
- smarty
- system //Здесь находятся файлы, инициализирующие основные функции системы (autoload, session, exception handlers)
- modules //Здесь должны находиться модули
- main //Модуль Main
- config //Здесь должны находиться конфигурационные классы модуля
- controller //Контроллеры модуля Main
- admin //Корневая папка для контроллеров административной части
- front //Корневая папка для фронт контроллеров
- block //Корневая папка для блочных контроллеров
- model //Корневая папка для моделей
- orm //Корневая папка для ORM объектов
- ... //Здесь может быть создана произвольная структура данных
- view //Корневая папка для шаблонов отображения
- users
- config
- controller
- model
- view
- ...
- resource //Папка для общих ресурсов(js, img, css)
- storage //Папка для пользовательских данных
- templates //Папка для тем оформления
- default //Тема оформления default
- moduleview //Папка для перегрузки шаблонов модулей
- main //Шаблоны в этой папке будут перегружать шаблоны модуля Main
Программный код в системе разделен на 2 составляющие ядро(фреймворк) и модули.
Фреймворк построен на основе PHP 7.1 и является объектно-ориентированным. Он содержит множество классов, решающих типовые задачи. В случае необходимости любой из классов может быть расширен с помощью механизмов наследования ООП. Такой подход позволяет максимально применить концепцию повторного использования кода.
Каждый класс в системе располагается в отдельном файле. Структура папок на пути к файлу с классом определяет его пространство имен (namespace), что позволяет системе быстро понять где искать тот или иной класс для автозагрузки.
Ниже представлены некоторые концепции и компоненты, присутствующие в ReadyScript:
MVC – как и многие современные системы, ReadyScript применяет концепцию Model-View-Controller для разделения бизнес-логики и отображения. Этот паттерн жестко заложен в архитектуре системы, что можно увидеть даже по структуре каталогов модуля:
- modules
- catalog
- controller //Каталог контроллеров
- model //Каталог моделей
- view //Каталог отображений
Такая концепция позволяет удобно использовать единожды разработанную бизнес-логику(модели) в различных контроллерах и с различными отображениями.
Hooks – Система событий. Позволяет модулям подписываться на события и изменять стандартный ход выполнения различных операций. Данная возможность просто необходима в модульных системах, так как позволяет без изменений ядра расширять его функционал.
Cache – Система кэширования является важной составляющей ядра, и применяется для хранения заранее подготовленных данных с целью их быстрого извлечения при необходимости. Использование КЭШа способно значительно ускорить выполнение скриптов, и снизить нагрузку на сервер. Однако данные в КЭШе устаревают со временем и их нужно обновлять. Для разработчиков в ReadyScript доступны 4 способа сброса КЭШа:
- по времени – через заданное время кэш будет автоматически обнуляться.
- по тегам – кэш данные, привязанные к указанному тегу будут сброшены.
- по изменению таблицы БД – любая операция INSERT, UPDATE, DELETE к таблице будет вызывать обнуление КЭШа, привязанного к этой таблице БД.
- по классу(и методу) – можно вызвать обнуление КЭШа по классу и/или методу, данные которого были помещены в кэш.
ORM – В ReadyScript применяется уникальная ORM система, созданная по паттерну ActiveRecord. Она позволяет разработчику полностью абстрагироваться от базы данных и работать только с объектами PHP. Каждый ORM объект имплементирует интерфейс ArrayAccess, Iterator, что позволяет работать с объектом как с массивом. ORM-объекты ReadyScript способны автоматически приводить в соответствие структуру базу данных, а также генерировать HTML формы.
Например:
- $product = new Product();
- $product[‘title’] = ‘Самолет’;
- $product[‘description’] = ‘Модель: A380’;
- $product->description = ‘Модель: A380’; //Допустима и такая запись
- $product->insert();
Результатом данной операции будет вызов SQL запроса:
- INSERT INTO `database`.`productTable`(title, description) VALUES('Самолет', 'Модель: A380');
Для организации выборок объектов существует класс Request, который позволяет произвести выборку объектов по любым условиям. Ниже представлен простейший пример выборки объектов с названием ‘Самолет’.
- $products = \RS\Orm\Request::make()
- ->select(‘*’)
- ->from(new Product())
- ->where(array(
- ‘title’ => ‘Самолет’
- ))->objects();
Результатом данной операции будет выполненный запрос:
- SELECT * FROM `database`.`productTable` WHERE `title` = 'Самолет';
и сформированный массив объектов Product с названием ‘Самолет’ в переменной $products
Routing - мы отказались от написания конкретных URL в шаблонах. Теперь любой модуль может точно направить пользователя на нужную страницу.
View Helpers - мы сделали вспомогательные классы для конструирования стандартных интерфейсов административной панели. Используя эти классы можно в считанные минуты собрать любой интерфейс, связанный с CRUD действиями, всевозможными фильтрами, и кнопками.
Css/Js – мы используем централизованное управление стилями и скриптами, подключаемыми на отдельных страницах. И даже более того, система корректно отрабатывает подключение скриптов и стилей в ajax - режиме загрузки страниц.
Микроформаты – у нас уже есть готовые обработчики различных ситуаций в виде jquery плагинов для административной панели. Наделяйте ваш шаблон поведением, просто добавляя CSS-классы в разметке HTML.
Модульность – чтобы создать новый модуль – не нужно его где-то прописывать, включать в какие-либо списки. Просто создайте каталог с модулем в папке modules и система сама распознает его. Включенный модуль может подписываться на все события системы и вносить корректировки в поведение.
Smarty 3 – Для рендеринга шаблонов используется самый популярный в мире шаблонизатор, который значительно улучшает читаемость шаблонов и имеет огромное количество возможностей, включая и наследование шаблонов.
Отсутствие магических массивов – основным недостатком известных фреймворков является то, что конструкторы принимают массивы с магическими параметрами, о которых можно узнать только в документации. В целях ускорения процесса разработки, мы решили подсказывать о том, что ожидается в таких массивах с помощью имен методов класса. Например:
- $singlePhoto = new Preset\SinglePhoto(array(
- 'linkPresetId' => 0,
- 'linkForeignField' => 'image',
- 'title' => 'Изображение'
- ));
будет равносильно вызову:
- $singlePhoto = new Preset\SinglePhoto();
- $singlePhoto->setLinkPresetId(0);
- $singlePhoto->setLinkForeignField (‘image’);
- $singlePhoto->setTitle(‘Изображение’);
т.е. просмотрев методы, начинающиеся с set или add в классе сразу можно понять, как можно кратко инициализировать объект через конструктор и посмотрев подпись PHPDoc к методу в современных IDE сразу можно понять данные какого типа ожидаются в значениях массива.
Расширение поведения (behavior) – добавляйте собственные методы к ORM объектам из других модулей. Это удобно, когда нужно добавить возможности к существующим объектам в системе, например, чтобы воспользоваться этим в шаблонах.
Удобная система изображений – залог быстрого подключения шаблонов. При загрузке фото, система сохраняет "крупное изображение". И в любом участке кода или шаблона имеется возможность сгенерировать ссылку на фото нужного размера и типа масштабирования. Непосредственно создание уменьшенного изображения будет происходить единожды во время запроса картинки браузером. Ссылка на изображение содержит в себе цифровую подпись, что не позволит злоумышленнику "положить" сервер запросами на масштабирование. Картинки на сервере складываются в удобную древовидную структуру, что помогает избежать большого скопления файлов в одной директории.
Фреймворк для внешних API – в настоящее время интернет-магазин должен активно взаимодействовать с любым сторонним ПО, мобильными и Desktop приложениями. В ReadyScript предусмотрено все, чтобы в кратчайшие сроки добавить собственные методы API. Также есть все необходимые инструменты для отладки запросов к API, автоматического построения документации, разграничения прав.
Готовая подсистема Email, SMS, ПК уведомлений – создавайте класс уведомления и наделяйте его поведением, имплементируя интерфейс Email, SMS или Desktop уведомления(можно все вместе). Абстрагируйтесь от задачи доставки этих уведомлений, ReadyScript позаботится об этом сам.
Более подробно ознакомиться с устройством системы можно с помощью руководства для разработчиков.