-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Sergey Surkov
committed
Aug 25, 2021
0 parents
commit 6224af3
Showing
172 changed files
with
15,982 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# 3-Clause BSD License | ||
Copyright © 2021 DissonancePHP. | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are | ||
met: | ||
|
||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above copyright | ||
notice, this list of conditions and the following disclaimer in | ||
the documentation and/or other materials provided with the | ||
distribution. | ||
* Neither the name of DissonancePHP nor the names of its | ||
contributors may be used to endorse or promote products derived | ||
from this software without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,287 @@ | ||
# Dissonance Web (MVP, BETA-PRE-ZERO EDITION) | ||
### Описание | ||
**Фреймфорк создан с целью упростить интеграцию независимых небольших приложений в другие CMS и фреймворки, а также для расширения функциональности пакетов для композера.** | ||
|
||
|
||
Идеология - отдельная экосистема небольших приложений для совместной работы вместе с другими фреймворками и удобной интеграции дополнительного функционала. | ||
|
||
Есть много пакетов и отдельно написанных приложений, | ||
которые поставляют полезный функционал, имеют свою бизнес логику и иногда даже имеют свой отдельный веб интерфейс. | ||
|
||
В ларавель пакеты, в симфони бандлы, в различных CMS в виде плагинов и дополнений, и у всех своя реализация роутинга, событий, кеширования и т.д. Взять пакет, написанный для ларавель, и интегрировать его в другой фреймворк или CMS, в большинсте случаев будет проблематично, а в некоторых нереально из-за определенных зависимостей от фреймворка. | ||
|
||
|
||
Самим разработчикам приложений приходится писать адаптацию под каждый фреймворк и CMS, что создает много проблем и не покрывает все известные экосистемы. | ||
|
||
Также такие приложения приходится интегрировать в систему: | ||
1. Настраивать ACL | ||
2. Интегрировать неоходимые скрипты админку и на фронт | ||
3. Создавать обработчики запросов и структуру в бд | ||
4. Делать связку с файловой системой | ||
5. Делать сохранение настроек и конфигурации | ||
|
||
Примеров таких приложений много: | ||
- одностраничные приложения | ||
- текстовые редакторы и их плагины с несколькими уровнями зависимости (плагин для плагина) | ||
- обработчики картинок | ||
- различные оптимизаторы и компрессоры | ||
- приложения для работы с файлами и базами данных | ||
- чат боты | ||
- административные, аналитические интрументы | ||
- лендинги и другие микро приложения | ||
- ..... | ||
|
||
|
||
Фреймворк оптимизирован для работы с большим количеством приложений, а также для работы в качетсве подсистемы для основного фреймворка. | ||
|
||
Каждое приложение является композер пакетом, | ||
с дополнительным описанием прямо в файле composer.json. | ||
|
||
## Характеристики | ||
- PSR дружественный | ||
- Мало зависимостей (только PSR интерфейсы и PSR-7 имплементация) | ||
- Небольшой вес (370 кб дев версия и формтированием и коментариями, продакт 170 кб) | ||
- Оптимизирован для работы в симбиозе с другими фреймворками | ||
- Многоуровневая система контейнеров (Ядро<-Приложение<-Плагин), с доступом к контейнеру родителю. | ||
- Виртуальная файловая система (прокидывание статики прямо из папки пакета) | ||
- Всем знакомое апи контейнера | ||
- Шаблонизатор Blade(урезанный и кривой пока), + возможность прокинуть свой шаблонизатор. | ||
- Никаких сборщиков статики (Каждый пакет должен иметь уже скомпилировынные файлы). | ||
- Отложенный роутинг (грузятся только роуты запрошенного приложения, определяется по префиксу-поселению). | ||
- Возможность расширять конревые сервисы (Бутстраперы и сервисы). | ||
- У каждого приложения свой сервис контейнер и сервисы. | ||
- Поддержка кеша (PSR-16 Simple Cache) + Кешируемый cервис контейнер. | ||
- Для тех, кто будет тестировать: отличное приключение (почти реверс), абсолютно без документации и все одном файле!!!))) | ||
|
||
## Установка | ||
``` | ||
composer require dissonance/full | ||
``` | ||
Сразу ставьте и пакет для разработки | ||
``` | ||
composer require dissonance/develop | ||
``` | ||
|
||
## Запуск | ||
|
||
Фреймворк подключается из композера прямо в ваш index.php. | ||
|
||
Если вы используете уже фреймворк, то необходимо включить режим симбиоза в конфиге | ||
```php | ||
$config['symbiosis'] = true; | ||
``` | ||
##### Инициализация | ||
```php | ||
$basePath = dirname(__DIR__);// корневая папка проекта | ||
include_once $basePath . '/vendor/autoload.php'; | ||
|
||
include $basePath.'/vendor/dissonance/full/src/dissonance.php'; | ||
|
||
// Дальше может идти код инициализации и отработки другого фреймворка... | ||
//.... | ||
|
||
``` | ||
## Расширенный способ | ||
```php | ||
|
||
|
||
|
||
$basePath = dirname(__DIR__);// корневая папка проекта | ||
include_once $basePath. '/vendor/autoload.php'; | ||
|
||
$config = [ | ||
'debug' => true, | ||
'symbiosis' => true, // Режим симбиоза, если включен и фреймворк не найдет обработчик, | ||
// то он ничего не вернет и основной фреймворк смодет сам обработать запрос | ||
'default_host' => 'localhost',// для консоли , но ее пока нет | ||
'uri_prefix' => 'dissonance', // Префикс в котором работет фреймворк, если пустой то работае от корня | ||
'base_path' => $basePath, // базовая папка проекта | ||
'assets_prefix' => '/assets', | ||
'storage_path' => $basePath . '/storage', // Если убрать то кеш отключится | ||
'packages_paths' => [ | ||
$basePath . '/vendor', // Папка для приложений | ||
], | ||
'bootstrappers' => [ | ||
\Dissonance\Develop\Bootstrap\DebugBootstrap::class,/// debug only | ||
\Dissonance\Bootstrap\EventBootstrap::class, | ||
\Dissonance\SimpleCacheFilesystem\Bootstrap::class, | ||
\Dissonance\PackagesLoaderFilesystem\Bootstrap::class, | ||
\Dissonance\Packages\PackagesBootstrap::class, | ||
\Dissonance\Packages\ResourcesBootstrap::class, | ||
\Dissonance\Apps\Bootstrap::class, | ||
\Dissonance\Http\Bootstrap::class, | ||
\Dissonance\HttpKernel\Bootstrap::class, | ||
\Dissonance\CacheRouting\Bootstrap::class, | ||
\Dissonance\ViewBlade\Bootstrap::class, | ||
], | ||
'providers' => [ | ||
\Dissonance\Http\Cookie\CookiesProvider::class, | ||
\Dissonance\SettlementsRouting\Provider::class, | ||
\Dissonance\Session\NativeProvider::class, | ||
], | ||
'providers_exclude' => [ | ||
\Dissonance\Routing\Provider::class, | ||
] | ||
]; | ||
|
||
// Базовая постройка контейнера | ||
$core = new \Dissonance\Core($config); | ||
// Или через билдер с кешем | ||
$cache = new Dissonance\SimpleCacheFilesystem\SimpleCache($basePath . '/storage/cache/core'); | ||
$core = (new \Dissonance\CachedContainer\ContainerBuilder($cache)) | ||
->buildCore($config); | ||
|
||
// Запуск | ||
$core->run(); | ||
// Дальше может идти код инициализации и отработки другого фреймворка... | ||
|
||
``` | ||
##### Схема описания расширения и приложения для фреймворка | ||
Берем стандартный пакет композера и добавляем: | ||
```json | ||
{ | ||
"name": "vendor/package", | ||
"require": { | ||
// ... | ||
}, | ||
"autoload": { | ||
/// | ||
|
||
}, | ||
// Добавляем описание пакета для фреймворка | ||
"extra": { | ||
"dissonance": { | ||
"id": "wso.my_package_id", // ID пакета формируется на сайте фреймворка, но можно локально любой ставить | ||
// Описание приложения, пакет может и не иметь секцию приложения, а быть лишь расширением | ||
"app": { | ||
"id": "my_package_id", // Id приложения, указывается без префикса родительского приложения | ||
"parent_app": "wso", // ID родительсского приложения, если приложение плагин | ||
"name": "WSO Users exporter", // Имя приложения, используется в списке приложений и меню | ||
"routing": "\\\\MyVendor\\\\MySuperPackage\\\\Routing", // Класс роутинга, не обязательно | ||
"controllers_namespace": "\\\\Dissonance\\\\Develop\\\\Controllers", // Базовый неймспейс для контроллеров, не обязательно | ||
"version": "1.0.0", // Версия, не обязательно, плагины могут проверять и подстаиваться под изменения | ||
"providers": [ // Провайдеры приложения, не обязательно | ||
"MyVendor\\\\MySuperPackage\\\\Providers\\\\AppProvider" | ||
], | ||
// Не обязательно! Наследник от \\Dissonance\\App\\Application | ||
"app_class": "MyVendor\\\\MySuperPackage\\\\MyAppContainer" | ||
}, | ||
|
||
// Расширения ядра фреймворка, не обязательно | ||
"bootstrappers":[ | ||
"MyVendor\\\\MySuperPackage\\\\CoreBootstrap" // Загрузчики | ||
], | ||
"providers" : [ | ||
"MyVendor\\\\MySuperPackage\\\\MyDbProvider" // Провайдеры | ||
], | ||
"providers_exclude" : [ | ||
// Исключение провайдеров из загрузки | ||
// Например при двух пакетах одной библиотеки позволяет исключить не нужную | ||
] | ||
} | ||
} | ||
} | ||
|
||
``` | ||
|
||
#### Пример пакета только со статикой | ||
Всего пару строк: | ||
```json | ||
{ | ||
"name": "vendor/package", | ||
"require": { | ||
// ... | ||
}, | ||
"autoload": { | ||
// ... | ||
}, | ||
"extra": { | ||
"dissonance": { | ||
"id": "my_super_theme_2", | ||
// Можно указать что то одно или все вместе | ||
"public_path": "assets", // Папка со статикой, относительно корня пакета | ||
"resources_path": "my_resources", // Папка c шаблонами и другими файлами, не доступны через http | ||
// можно прокинуть в веб при необходимости через специальный объект доступа к ресурсам | ||
} | ||
} | ||
} | ||
|
||
``` | ||
|
||
|
||
#### Пример пакета приложения | ||
При конфигурации приложения можно не указывать пути для статики и ресурсов, тогда будут определены пути по умолчанию: | ||
|
||
- public_path = assets | ||
- resources_path = resources | ||
|
||
Шаблоны всегда дожны лежать в директории /view/ в папке ресурсов! | ||
```json | ||
{ | ||
"name": "vendor/package", | ||
"require": { | ||
// ... | ||
}, | ||
"autoload": { | ||
// ... | ||
}, | ||
"extra": { | ||
"dissonance": { | ||
"app": { | ||
"id": "my_package_id", // Id приложения | ||
"routing": "\\\\MyVendor\\\\MySuperPackage\\\\Routing", | ||
"controllers_namespace": "\\\\Dissonance\\\\Develop\\\\Controllers" | ||
}, | ||
} | ||
} | ||
} | ||
|
||
``` | ||
|
||
## Примерная структура пакета | ||
Четкой обязательной структуры нет, можно использовать любую. | ||
```text | ||
vendor/ | ||
-/my_vendor | ||
-/my_package_name | ||
-/assets - Статика | ||
-/js | ||
-/css | ||
-/... | ||
-/resources - Ресурсы | ||
-/views | ||
-/... | ||
-/src - Ваш пакет | ||
-/Http | ||
-/Cоntrollers | ||
-/... | ||
-/ ... | ||
-/Routing.php | ||
-/composer.json | ||
``` | ||
|
||
При необходимости можно поселить все классы для приложения фреймворка в подпапку src/Dissonance. Так не будет путаницы с функционалом вашего пакета. | ||
|
||
```text | ||
vendor/ | ||
-/my_vendor | ||
-/my_package_name | ||
-/dissonance | ||
-/assets - Статика | ||
-/js | ||
-/css | ||
-/... | ||
-/resources - Ресурсы | ||
-/views | ||
-/... | ||
-/src - Ваш пакет | ||
-/Dissonance | ||
-/Http | ||
-/Cоntrollers | ||
-/... | ||
-/Routing.php | ||
-/Ваши папки и файлы ... | ||
-/composer.json | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
{ | ||
"name": "dissonance/full", | ||
"description": "Полная сборка пакетов фреймворка Dissonance.", | ||
"license": "BSD-3-Clause", | ||
"version": "1.1.0", | ||
"authors": [{ | ||
"name": "Surkov Sergey", | ||
"role": "creator" | ||
}], | ||
"keywords": [ | ||
"dissonance", | ||
"composer apps framework", | ||
"dissonance web" | ||
], | ||
"require": { | ||
"php": ">=8.0", | ||
"psr/http-server-handler": "1.0.*", | ||
"psr/http-server-middleware": "1.0.1", | ||
"psr/http-factory": "1.0.1", | ||
"psr/event-dispatcher": "1.0.*", | ||
"psr/container": "^1.0", | ||
"psr/simple-cache": "1.*", | ||
"nyholm/psr7": ">=1.3.2", | ||
"dissonance/ui_http_kernel": "1.*", | ||
"ext-json": "*" | ||
}, | ||
"autoload": { | ||
"psr-4":{ | ||
"Dissonance\\": "src/" | ||
}, | ||
"files": [ | ||
"src/core_helpers.php", | ||
"src/http_kernel_helpers.php" | ||
] | ||
}, | ||
"suggest": { | ||
"dissonance/full-single": "Полная сборка в одном файле", | ||
"dissonance/develop": " Dev app" | ||
}, | ||
"replace": { | ||
"dissonance/apps": "1.0.*", | ||
"dissonance/cached-container": "1.0.*", | ||
"dissonance/container": "1.0.*", | ||
"dissonance/container-contracts": "1.0.*", | ||
"dissonance/container-traits": "1.0.*", | ||
"dissonance/core": "1.0.*", | ||
"dissonance/event": "1.0.*", | ||
"dissonance/http": "1.0.*", | ||
"dissonance/http-kernel": "1.0.*", | ||
"dissonance/http-middlewares": "1.0.*", | ||
"dissonance/http-response-mutable": "1.0.*", | ||
"dissonance/mimetypes-mini": "1.0.*", | ||
"dissonance/packages": "1.0.*", | ||
"dissonance/packages-contracts": "1.0.*", | ||
"dissonance/routing": "1.0.*", | ||
"dissonance/routing-cache": "1.0.*", | ||
"dissonance/routing-settlements": "1.0.*", | ||
"dissonance/simple-cache-filesystem": "1.0.*", | ||
"dissonance/http-cookie": "1.0.*", | ||
"dissonance/contracts": "1.0.*", | ||
"dissonance/session-native": "1.0.*", | ||
"dissonance/view-blade": "1.0.*" | ||
} | ||
} |
Oops, something went wrong.