composer require symbiotic/full
- PSR дружественный
- Мало зависимостей (только PSR интерфейсы и PSR-7 реализация)
- Небольшой вес (440 kb c форматированием и комментариями, сборка в одном файле 200 kb).
- Оптимизирован для работы в симбиозе с другими фреймворками
- Многоуровневая система DI контейнеров (Ядро <- Приложение <- Плагин), с доступом к контейнеру родителю.
- Виртуальная файловая система (проксирование статики из папки пакета в web)
- Всем знакомое апи контейнера (laravel/container)
- Шаблонизатор Blade (урезанный), + возможность прокинуть свой шаблонизатор.
- Никаких сборщиков статики (Каждый пакет должен иметь уже скомпилированные файлы).
- Отложенный роутинг (грузятся только роуты запрошенного приложения, определяется по префиксу-поселению).
- Возможность расширять корневые сервисы через Bootstrap и ServiceProvider.
- У каждого приложения свой сервис контейнер и сервисы.
- Поддержка кеша (PSR-16 Simple Cache) + Кешируемый Service Container.
- Поддержка Middleware для перехвата запроса до загрузки ядра фреймворка (ответ за 1 мс)
Для более быстрой работы на хостингах без оптимизации PHP, сборка в одном файле symbiotic/full-single
Фреймворк создан с целью упростить интеграцию независимых небольших приложений в другие CMS и фреймворки, а также для расширения функциональности пакетов композера.
Идеология - отдельная экосистема небольших приложений для совместной работы вместе с другими фреймворками и удобной интеграции дополнительного функционала.
Есть много пакетов и отдельно написанных приложений, которые поставляют полезный функционал, имеют свою бизнес логику и иногда даже имеют свой отдельный веб интерфейс.
В Laravel пакеты, в Symfony Bundles, в различных CMS в виде плагинов и дополнений, у всех своя реализация роутинга, событий, кеширования и т.д. Взять пакет, написанный для Laravel и интегрировать его в другой фреймворк или CMS, в большинстве случаев будет проблематично, а в некоторых невозможно из-за определенных зависимостей от фреймворка.
Самим разработчикам приложений приходится писать адаптацию под каждый фреймворк и CMS, что создает много проблем и не покрывает все экосистемы.
Также таким приложениям приходится делать различные интеграции в систему:
- Настраивать ACL
- Интегрировать необходимые скрипты админ панель и на сайт
- Создавать обработчики запросов и структуру в бд
- Делать связку с файловой системой
- Делать сохранение настроек и конфигурации
К таким приложениям можно отнести:
- Приложения одностраничники
- Текстовые редакторы и их плагины с несколькими уровнями зависимости (плагин для плагина)
- Обработчики медиа
- Различные оптимизаторы и компрессоры
- Приложения для административной работы с файлами и базами данных
- Чат боты, мессенджеры, виджеты
- Компоненты интеграционных АПИ, провайдеры авторизации
- Средства администрирования и мониторинга хостинга, аналитические инструменты
- Лендинги и другие микро приложения ....
Фреймворк оптимизирован для работы с большим количеством приложений, а также для работы в качестве подсистемы для основного фреймворка.
Каждое приложение является композер пакетом, с дополнительным описанием прямо в файле composer.json.
Фреймворк подключается из композера прямо в ваш index.php.
Если вы используете уже фреймворк, то необходимо включить режим симбиоза в конфиге
$config['symbiosis'] = true;
$basePath = dirname(__DIR__);// корневая папка проекта
include_once $basePath . '/vendor/autoload.php';
include $basePath.'/vendor/symbiotic/full/src/symbiotic.php';
// Дальше может идти код инициализации и отработки другого фреймворка при включенном режиме симбиоза...
//....
$basePath = dirname(__DIR__);// корневая папка проекта
include_once $basePath. '/vendor/autoload.php';
$config = include $basePath.'/vendor/symbiotic/full/src/config.sample.php';
//.. Ваши настройки конфига
// Базовая постройка контейнера
$core = new \Symbiotic\Core\Core($config);
/**
* При установке пакета symbiotic/full доступен кешируемый контейнер
* Инициализация в таком случае происходит через Builder:
*/
$cache = new Symbiotic\Cache\FilesystemCache($config['storage_path'] . '/cache/core');
$core = (new \Symbiotic\Core\ContainerBuilder($cache))
->buildCore($config);
// Запуск
$core->run();
// Дальше может идти код инициализации и отработки другого фреймворка...
Минимальная схема описания приложения в файле composer.json:
{
"name": "vendor/package",
"require": {
// ...
},
"autoload": {
// ...
},
"extra": {
"symbiotic": {
"app": {
// ID приложения
"id": "my_package_id",
// Провайдер роутинга
"routing": "\\MyVendor\\MySuperPackage\\Routing",
// Базовый namespace для контроллеров
"controllers_namespace": "\\MyVendor\\MySuperPackage\\Http\\Controllers"
}
}
}
}
{
"name": "vendor/package",
"require": {
// ...
},
"autoload": {
// ...
},
// Добавляем описание пакета для фреймворка
"extra": {
"symbiotic": {
"id": "wso.my_package_id",
// ID пакета
// Описание приложения, пакет может и не иметь секцию приложения
"app": {
// ID приложения, указывается без префикса родительского приложения
"id": "image_optimizer",
// ID родительского приложения (не обязательно)
"parent_app": "media",
// Название приложения, используется в списке приложений и меню
"name": "Media images optimizer",
// Класс роутинга (не обязательно)
"routing": "\\MyVendor\\MySuperPackage\\Routing",
// Базовый неймспейс для контроллеров (не обязательно)
"controllers_namespace": "\\Symbiotic\\Develop\\Controllers",
// Провайдеры приложения (не обязательно)
"providers": [
"MyVendor\\MySuperPackage\\Providers\\AppProvider"
],
// Класс контейнера приложения (не обязательно)
// Наследник от \\Symbiotic\\App\\Application
"app_class": "MyVendor\\MySuperPackage\\MyAppContainer"
},
// Папка со статикой, относительно корня пакета (не обязательно)
"public_path": "assets",
// Папка c шаблонами и другими ресурсами (не доступны через Web) (не обязательно)
"resources_path": "my_resources",
// Расширения ядра фреймворка
// Загрузчики (не обязательно)
"bootstrappers": [
"MyVendor\\MySuperPackage\\CoreBootstrap"
],
// Провайдеры (не обязательно)
"providers": [
"MyVendor\\MySuperPackage\\MyDbProvider"
],
// Исключение провайдеров ядра (не обязательно)
"providers_exclude": [
// Исключение провайдеров из загрузки
// Например при двух пакетах одной библиотеки позволяет исключить не нужную
],
// Подписчики на события (не обязательно)
"events": {
"handlers": {
"Symbiotic\\Form\\FormBuilder": "MyVendor\\MyApp\\Events\\FilesystemFieldHandler",
"Symbiotic\\Settings\\FieldTypesRepository": "MyVendor\\MyApp\\Events\\FieldsHandler",
"Symbiotic\\UIBackend\\Events\\MainSidebar": "MyVendor\\MyApp\\Events\\Menu"
}
},
// Поля настроек пакета (не обязательно)
"settings_fields": [
{
"title": "Fields group 1",
"name": "group_1",
"collapsed": 0,
"type": "group",
"fields": [
{
"label": "Field 1",
"name": "filed_name_1",
"type": "text"
},
{
"label": "Select 1",
"name": "select_1",
"type": "select",
"variants": {
"value1" :"title1",
"value12" :"title2"
}
},
{
"label": "Boolean checkbox",
"name": "debug",
"description": "Debug mode",
"type": "boolean"
}
]
}
],
// Настройки по умолчанию (не обязательно)
"settings": {
"filed_name_1": "demo_value",
"select_1": "value12",
"debug": "0"
},
// Консольные команды (не обязательно)
"commands": {
"worker": "MyVendor\\MyApp\\Commands\\Worker",
"stop": "MyVendor\\MyApp\\Commands\\Stop"
}
}
}
}
При конфигурации приложения можно не указывать пути для статики и ресурсов, тогда будут определены пути по умолчанию:
- public_path = assets
- resources_path = resources
Шаблоны всегда должны лежать в директории /view/ в папке ресурсов!
Все пакеты для фреймворка можно разделить на несколько основных категорий:
- Приложение или плагин приложения
- Компонент (любой композер пакет которому нужны настройки или работа с ресурсами)
- Расширение ядра (заменяет или добавляет ключевые компоненты ядра фреймворка)
- Пакет статики (тема дизайна, пакет с публичными ресурсами)
Любой пакет может в себе сочетать все выше перечисленное.
Четкой обязательной структуры нет, можно использовать любую.
vendor/
-/my_vendor
-/my_package_name
-/assets - Статика
-/js
-/css
-/...
-/resources - Ресурсы
-/views - Шаблоны
-/...
-/src - Ваш пакет
-/Http
-/Cоntrollers
-/...
-/Services
...
-/Routing.php
-/composer.json