Skip to content

Latest commit

 

History

History
307 lines (252 loc) · 14.1 KB

README.RU.md

File metadata and controls

307 lines (252 loc) · 14.1 KB

Symbiotic Full (BETA EDITION)

Установка

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, что создает много проблем и не покрывает все экосистемы.

Также таким приложениям приходится делать различные интеграции в систему:

  1. Настраивать ACL
  2. Интегрировать необходимые скрипты админ панель и на сайт
  3. Создавать обработчики запросов и структуру в бд
  4. Делать связку с файловой системой
  5. Делать сохранение настроек и конфигурации

К таким приложениям можно отнести:

  • Приложения одностраничники
  • Текстовые редакторы и их плагины с несколькими уровнями зависимости (плагин для плагина)
  • Обработчики медиа
  • Различные оптимизаторы и компрессоры
  • Приложения для административной работы с файлами и базами данных
  • Чат боты, мессенджеры, виджеты
  • Компоненты интеграционных АПИ, провайдеры авторизации
  • Средства администрирования и мониторинга хостинга, аналитические инструменты
  • Лендинги и другие микро приложения ....

Фреймворк оптимизирован для работы с большим количеством приложений, а также для работы в качестве подсистемы для основного фреймворка.

Каждое приложение является композер пакетом, с дополнительным описанием прямо в файле 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