Skip to content

Commit

Permalink
The framework is divided into two packages, the basic one and its "fu…
Browse files Browse the repository at this point in the history
…ll" extension
  • Loading branch information
Sergey Surkov committed Sep 14, 2022
1 parent 8518e78 commit 6823ce0
Show file tree
Hide file tree
Showing 239 changed files with 2,173 additions and 18,091 deletions.
2 changes: 1 addition & 1 deletion LICENSE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# 3-Clause BSD License
Copyright © 2021 SymbioticPHP.
Copyright © 2022 SymbioticPHP.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
Expand Down
307 changes: 307 additions & 0 deletions README.RU.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,307 @@
# Symbiotic Full (BETA EDITION)

## Установка
```
composer require symbiotic/full
```

## Особенности

- PSR дружественный
- Мало зависимостей (только PSR интерфейсы и PSR-7 реализация)
- Небольшой вес (440 kb c форматированием и комментариями, [сборка в одном файле 200 kb](https://github.com/symbiotic-php/full-single/)).
- Оптимизирован для работы в симбиозе с другими фреймворками
- Многоуровневая система DI контейнеров **(Ядро <- Приложение <- Плагин)**, с доступом к контейнеру родителю.
- Виртуальная файловая система (проксирование статики из папки пакета в web)
- Всем знакомое апи контейнера (laravel/container)
- Шаблонизатор Blade (урезанный), + возможность прокинуть свой шаблонизатор.
- Никаких сборщиков статики (Каждый пакет должен иметь уже скомпилированные файлы).
- Отложенный роутинг (грузятся только роуты запрошенного приложения, определяется по префиксу-поселению).
- Возможность расширять корневые сервисы через Bootstrap и ServiceProvider.
- У каждого приложения свой сервис контейнер и сервисы.
- Поддержка кеша (PSR-16 Simple Cache) + Кешируемый Service Container.
- Поддержка Middleware для перехвата запроса до загрузки ядра фреймворка (ответ за 1 мс)

Для более быстрой работы на хостингах без оптимизации PHP, сборка в одном файле [symbiotic/full-single](https://github.com/symbiotic-php/full-single/)


## Описание

**Фреймворк создан с целью упростить интеграцию независимых небольших приложений в другие CMS и фреймворки,
а также для расширения функциональности пакетов композера.**

Идеология - отдельная экосистема небольших приложений для совместной работы вместе с другими фреймворками и удобной
интеграции дополнительного функционала.

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

В Laravel пакеты, в Symfony Bundles, в различных CMS в виде плагинов и дополнений, у всех своя реализация роутинга,
событий, кеширования и т.д.
Взять пакет, написанный для Laravel и интегрировать его в другой фреймворк или CMS, в большинстве случаев будет
проблематично, а в некоторых невозможно из-за определенных зависимостей от фреймворка.

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

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

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

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

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

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

Каждое приложение является композер пакетом,
с дополнительным описанием прямо в файле composer.json.

## Запуск

Фреймворк подключается из композера прямо в ваш index.php.

Если вы используете уже фреймворк, то необходимо включить режим симбиоза в конфиге

```php
$config['symbiosis'] = true;
```

##### Инициализация

```php
$basePath = dirname(__DIR__);// корневая папка проекта
include_once $basePath . '/vendor/autoload.php';

include $basePath.'/vendor/symbiotic/full/src/symbiotic.php';

// Дальше может идти код инициализации и отработки другого фреймворка при включенном режиме симбиоза...
//....


```

## Расширенный способ

```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:**

```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"
}
}
}
}

```

#### Полная схема описания пакета для фреймворка

```json
{
"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/ в папке ресурсов!

## Типы пакетов

Все пакеты для фреймворка можно разделить на несколько основных категорий:

- Приложение или плагин приложения
- Компонент (любой композер пакет которому нужны настройки или работа с ресурсами)
- Расширение ядра (заменяет или добавляет ключевые компоненты ядра фреймворка)
- Пакет статики (тема дизайна, пакет с публичными ресурсами)

**Любой пакет может в себе сочетать все выше перечисленное.**

## Примерная файловая структура пакета

Четкой обязательной структуры нет, можно использовать любую.

```text
vendor/
-/my_vendor
-/my_package_name
-/assets - Статика
-/js
-/css
-/...
-/resources - Ресурсы
-/views - Шаблоны
-/...
-/src - Ваш пакет
-/Http
-/Cоntrollers
-/...
-/Services
...
-/Routing.php
-/composer.json
```
Loading

0 comments on commit 6823ce0

Please sign in to comment.