Soli - это легкая PHP -структура, которая относится к конструкции фреймворка Phalcon и Laravel и предназначена для того, чтобы быть свободно связанным, масштабируемым, простым и простым в использовании.
MVC, инъекция зависимостей, управление событиями, флэш -сообщения, маршрутизацию шаблона (Twig, Smarty), приложение командной строки и другие функции
На рисунке выше мы видим, что поток обработки запроса SOLI:
Приложение передает полученный HTTP -запрос процессу маршрутизации и передает результат маршрутизации планировщику контроллера; Контроллер обрабатывает бизнес -логику приложения, вызывает соответствующую модель и представление, и возвращает результат обработки в приложение через планировщик, чтобы выполнить окончательную инкапсуляцию ответа HTTP.
Кроме того, SOLI предоставляет компонентные механизмы, обеспечиваемые контейнерами в зависимости, поэтому разработчики могут легко использовать различные услуги в контейнере при разработке компонентов.
Диспетчер событий Soli позволяет разработчикам перехватывать некоторые компоненты структуры или приложения, создавая «крючки». Чтобы получить информацию о состоянии, манипулировать данными или изменить поток выполнения в определенном процессе компонента.
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
Доступ к браузеру http: // localhost: 8000/.
upstream php-fpm
{
server unix:/tmp/php-fpm.sock;
}
server
{
listen 80 ;
server_name www.soliphp.com;
index index.html index.php;
root /path/to/soliphp/public;
location / {
try_files $uri $uri / /index.php? $query_string ;
}
location ~ .php$ {
include fastcgi.conf;
fastcgi_pass php-fpm;
}
} # Apache 2.4
< VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot " /path/to/soliphp/public "
DirectoryIndex index.php
ServerName www.soliphp.com
< Directory "/path/to/soliphp/public">
Options All
AllowOverride All
Allow from all
Require all granted
RewriteEngine on
RedirectMatch 403 /..*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
</ Directory >
</ VirtualHost > ├── app 应用程序目录
│ ├── Console 终端命令应用控制器目录
│ │ ├── Command.php 终端命令应用基类
│ │ └── Demo.php Demo命令
│ ├── Controllers WEB应用控制器目录
│ │ ├── Controller.php 控制器基类
│ │ ├── IndexController.php 默认控制器
│ │ └── UserController.php 和用户相关的控制器
│ ├── Events 事件目录
│ │ ├── AppEvents.php WEB应用事件
│ │ └── UserEvents.php 用户相关的事件
│ ├── Models 模型目录
│ │ ├── Model.php 模型基类
│ │ └── UserModel.php 用户模型
│ ├── Services 服务层目录
│ │ ├── Service.php 服务基类
│ │ └── UserService.php 用户相关的服务
│ └── bootstrap.php
├── bin
│ └── console 终端命令应用入口文件
├── composer.json composer配置文件
├── config 配置文件目录
│ ├── config.php 基础配置文件
│ ├── console.php 针对终端命令应用的配置文件
│ ├── routes.php 路由配置文件
│ └── services.php 容器服务配置文件
├── phpcs.xml
├── public WEB服务公共可被访问的文件目录
│ ├── css
│ ├── img
│ ├── index.php WEB程序入口文件
│ └── js
├── var 生成的文件目录
│ ├── cache 缓存文件目录
│ └── log 日志文件目录
└── views 视图文件目录
└── index IndexController 对应的视图目录
└── index.twig index 函数对应的视图文件
Структура каталога не фиксирована. Структура каталогов может быть согласована в соответствии с фактическими потребностями проекта и привычками развития команды, и значение каждого каталога может быть определено и выражено.
Есть две основные константы, определенные в bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
Базовая информация о конфигурации хранится в файле config/config.php по умолчанию:
<?php
// 基本配置信息
$ config = array (
// 应用
' app ' => array (
' viewsDir ' => BASE_PATH . ' /views/ ' ,
' logDir ' => BASE_PATH . ' /var/log/ ' ,
' cacheDir ' => BASE_PATH . ' /var/cache/ ' ,
),
// 数据库
' db ' => array (
' dsn ' => ' mysql:host=localhost;port=3306;dbname=test;charset=utf8 ' ,
' username ' => ' root ' ,
' password ' => ' root ' ,
),
// 更多...
);Composer является отличным инструментом управления пакетами и тенденцией, поэтому SOLI использует композитор для автоматической загрузки и управления зависимостями.
В Composer.json каталог приложений настроен как пространство имен в начале приложения:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Следовательно, классы, определенные правилами PSR-4 в каталоге приложений, могут быть автоматически загружены при вызове, как контроллеры и консольные каталоги.
Цель контейнера впрыскивания зависимостей состоит в том, чтобы уменьшить сочетание кода и улучшить обслуживание применения. Преобразование зависимости между компонентами в зависимости от контейнеров и управление услугами (создание, конфигурация и позиционирование) выполняется через контейнеры.
Конфигурация службы контейнера хранится в файле config/services.php по умолчанию:
<?php
use Soli Di Container ;
use Soli Db Connection as DbConnection ;
use Soli Logger ;
use Soli View ;
use Soli View Engine Twig as TwigEngine ;
use Soli View Engine Smarty as SmartyEngine ;
$ container = new Container ();
// 将配置信息扔进容器
$ container -> set ( ' config ' , require BASE_PATH . ' /config/config.php ' );
// 配置数据库信息, Model中默认获取的数据库连接标志为"db"
// 可使用不同的服务名称设置不同的数据库连接信息,供 Model 中做多库的选择
$ container -> set ( ' db ' , function () {
return new DbConnection ( $ this -> config -> db );
});
// 路由
$ container -> set ( ' router ' , function () {
$ routesConfig = require BASE_PATH . ' /config/routes.php ' ;
$ router = new Soli Router ();
$ router -> setDefaults ([
// 控制器的命名空间
' namespace ' => " App \ Controllers \"
]);
foreach ( $ routesConfig as $ route ) {
list ( $ methods , $ pattern , $ handler ) = $ route ;
$ router -> map ( $ methods , $ pattern , $ handler );
}
return $ router ;
});
// TwigEngine
$ container -> set ( ' view ' , function () {
$ config = $ this -> config ;
$ view = new View ();
$ view -> setViewsDir ( $ config -> app -> viewsDir );
$ view -> setViewExtension ( ' .twig ' );
// 通过匿名函数来设置模版引擎,延迟对模版引擎的实例化
$ view -> setEngine ( function () use ( $ config , $ view ) {
$ engine = new TwigEngine ( $ view );
// 开启 debug 不进行缓存
//$engine->setDebug(true);
$ engine -> setCacheDir ( $ config -> app -> cacheDir . ' twig ' );
return $ engine ;
});
return $ view ;
});
// 如果使用 Smarty 的话,可进行如下设置:
// SmartyEngine
$ container -> set ( ' view ' , function () {
$ config = $ this -> config ;
$ view = new View ();
$ view -> setViewsDir ( $ config -> app -> viewsDir );
$ view -> setViewExtension ( ' .tpl ' );
// 通过匿名函数来设置模版引擎,延迟对模版引擎的实例化
$ view -> setEngine ( function () use ( $ config , $ view ) {
$ engine = new SmartyEngine ( $ view );
// 开启 debug 不进行缓存
$ engine -> setDebug ( true );
$ engine -> setOptions ( array (
' compile_dir ' => $ config -> app -> cacheDir . ' templates_c ' ,
' cache_dir ' => $ config -> app -> cacheDir . ' templates ' ,
' caching ' => true ,
' caching_type ' => ' file ' ,
' cache_lifetime ' => 86400 ,
));
return $ engine ;
});
return $ view ;
});Кроме того, Soli Web App регистрирует следующие обычно используемые службы по умолчанию для прямого использования контроллерами и пользовательскими компонентами:
| Название службы | представлять | по умолчанию | Это общий сервис? |
|---|---|---|---|
| маршрутизатор | Услуги маршрутизации | Soli web router | да |
| диспетчер | Служба планирования контроллера | Soli Dispatcher | да |
| запрос | HTTP -запрос услуг среды окружающей среды | Soli web request | да |
| Ответ | Служба среды реагирования HTTP | Soli web response | да |
| сессия | Сессионные услуги | Soli Web Session | да |
| вспышка | Служба флэш -сообщений | Soli web flash | да |
Позвольте разработчикам настраивать сервисы с тем же именем, чтобы переопределить сервисы по умолчанию выше.
Входные файлы веб -приложения хранятся на public/index.php по умолчанию и выглядят так:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();Класс контроллера по умолчанию «контроллер» и действие не имеет суффикса.
Контроллер может получить доступ к всем службам, зарегистрированным в контейнере, обращаяся к свойствам.
<?php
use Soli Controller ;
use App Models User ;
class UserController extends Controller
{
/**
* 用户详情
*
* 自动渲染 views/user/view.twig 视图
*/
public function view ( $ id )
{
// 这里调用了容器中的 view 服务,设置一个模版变量
$ this -> view -> setVar ( ' user ' , User:: findById ( $ id ));
}
}Модель SOLI предоставляет только некоторые общие методы для эксплуатационных баз данных и не реализует ORM. Это определяется нашим источником данных и архитектурой проекта. Возможно, что данные поступают из удаленного интерфейса, и также возможно, что команда более привыкла к использованию доктрины. Soli уважает выбор разработчиков и привычки использования в различных сценариях приложений и предоставляет простые методы масштабирования, позволяющие вам реализовать слои данных, подходящие для команд и фактических потребностей.
Используя модель:
<?php
use Soli Model ;
class User extends Model
{
}Здесь, призывая к модели пользователя, служба с именем «DB» в контейнере будет вызоваться по умолчанию, а имя таблицы операции - «Пользователь».
Если вам нужно указать другие службы подключения к базе данных, установите его через protected $connection модели:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Поскольку может быть указана служба подключения к базе данных, естественным образом поддерживаются операции с несколькими датабазами.
Модель автоматически преобразует формат верблюда имени класса в формат подчеркивания соответствующего имени таблицы, например, имя таблицы запоминания, которое преобразуется моделью по умолчанию, запоминается_token.
Мы также можем вручную указать имя таблицы через protected $table модели:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; Вы также можете указать первичный ключ через protected $primaryKey модели, а первичный ключ по умолчанию - id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; Первичный ключ в основном используется для функций findById и findByIds .
Пожалуйста, перейдите в SoliPHP/DB для поддерживаемых методов модели SOLI.
Файл представления сохраняется в каталоге представлений, а структура каталогов, соответствующая контроллеру, и представление:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
Приложение Controller/Controllers/usercontroller.php:
<?php
use Soli Controller ;
use App Models User ;
class UserController extends Controller
{
public function view ( $ id )
{
$ this -> view -> setVar ( ' user ' , User:: findById ( $ id ));
$ this -> flash -> notice ( ' user info ' );
}
}Просмотреть виды файлов/user/view.twig, здесь мы принимаем механизм шаблона ветки в качестве примера:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Для получения дополнительных способов использовать представление, перейдите в SoliPHP/View.
Спасибо за чтение.