Soli ist ein leichtes PHP -Framework, das sich auf das Design des Phalcon- und Laravel -Frameworks bezieht und lose gekoppelt, skalierbar, einfach und einfach zu bedienen ist.
MVC, Abhängigkeitsinjektion, Ereignisverwaltung, Flash -Nachrichten, Template Engine (Zweig, Smarty) Routing, Befehlszeilenanwendungen und andere Funktionen
Aus dem obigen Bild können wir sehen, dass der Verarbeitungsfluss der Soli -Anfrage lautet:
Die Anwendung befasst sich mit der empfangenen HTTP -Anforderung an den Routing -Prozess und übergibt das Routing -Ergebnis dem Controller -Scheduler. Der Controller verarbeitet die Geschäftslogik der Anwendung, ruft das entsprechende Modell und die entsprechende Ansicht auf und gibt das Verarbeitungsergebnis über den Scheduler an die Anwendung zurück, um die endgültige HTTP -Antworteinkapselung durchzuführen.
Darüber hinaus bietet Soli Komponentenmechanismen, die von Abhängigkeitsinjektionsbehältern bereitgestellt werden, sodass Entwickler bei der Entwicklung von Komponenten problemlos verschiedene Dienste im Container nutzen können.
Mit Solis Event Manager können Entwickler einige Komponenten des Frameworks oder der Anwendung abfangen, indem sie "Hooks" erstellen. Um Statusinformationen zu erhalten, Daten zu manipulieren oder den Ausführungsfluss in einem bestimmten Komponentenprozess zu ändern.
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
Browserzugriff 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 函数对应的视图文件
Die Verzeichnisstruktur ist nicht festgelegt. Die Verzeichnisstruktur kann gemäß den tatsächlichen Projektbedürfnissen und Teamentwicklungsgewohnheiten vereinbart werden, und die Bedeutung jedes Verzeichnisses kann definiert und ausgedrückt werden.
In bootstrap.php gibt es zwei grundlegende Konstanten:
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
Die grundlegenden Konfigurationsinformationen werden standardmäßig in der Datei config/config.php gespeichert:
<?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 ist ein hervorragendes Paket -Management -Tool und ein Trend. Daher verwendet Soli Composer zum automatischen Lade- und Abhängigkeitsmanagement.
In Composer.json ist das App -Verzeichnis zu Beginn der App als Namespace konfiguriert:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Daher können Klassen, die nach PSR-4-Regeln im App-Verzeichnis definiert sind, bei Aufrufen automatisch geladen werden, wie die Controller und Konsolenverzeichnisse.
Der Zweck des Abhängigkeitsinjektionsbehälters besteht darin, die Kopplung von Code zu verringern und die Wartbarkeit der Anwendung zu verbessern. Die Abhängigkeiten zwischen Komponenten in Abhängigkeiten von Containern verwandeln, und die Serviceverwaltung (Erstellung, Konfiguration und Positionierung) werden über Container durchgeführt.
Die Konfiguration des Containerdienstes wird standardmäßig in der Datei config/services.php gespeichert:
<?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 ;
});Darüber hinaus registriert Soli Web App die folgenden häufig verwendeten Dienste für direkte Verwendung durch Controller und benutzerdefinierte Komponenten:
| Servicename | einführen | Standard | Ist es ein gemeinsamer Service? |
|---|---|---|---|
| Router | Routingdienste | Soli Web Router | Ja |
| Dispatcher | Controller -Planungsdienst | Soli Dispatcher | Ja |
| Anfrage | HTTP -Anforderungsumgebungsdienst | Soli Web Anfrage | Ja |
| Antwort | HTTP Response Environment Service | Soli Web Antwort | Ja |
| Sitzung | Sitzungsdienste | Soli Web Session | Ja |
| Blitz | Flash Message Service | Soli Web Flash | Ja |
Ermöglichen Sie Entwicklern, Dienste mit demselben Namen anzupassen, um die obigen Standarddienste zu überschreiben.
Die Eintragsdateien der Webanwendung werden standardmäßig in public/index.php gespeichert und sehen Sie so aus:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();Die Controller Class stand für "Controller" und die Aktion hat kein Suffix.
Der Controller kann auf alle im Container registrierten Dienste zugreifen, indem sie auf Immobilien zugreifen.
<?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 ));
}
}Das Soli -Modell bietet nur einige gängige Methoden für Betriebsdatenbanken und implementiert ORM nicht. Dies wird durch unsere Datenquelle und unsere Projektarchitektur bestimmt. Es ist möglich, dass die Daten von einer Remote -Schnittstelle stammen, und es ist auch möglich, dass das Team eher an die Verwendung von Doktrin gewöhnt ist. Soli respektiert die Auswahl und Nutzungsgewohnheiten der Entwickler in verschiedenen Anwendungsszenarien und bietet einfach zu skalierende Methoden, mit denen Sie Daten implementieren können, die für Teams und die tatsächlichen Anforderungen geeignet sind.
Verwenden des Modells:
<?php
use Soli Model ;
class User extends Model
{
}Wenn Sie das Benutzermodell aufrufen, wird der Dienst mit dem Namen "DB" im Container standardmäßig aufgerufen, und der Tabellenname des Vorgangs lautet "Benutzer".
Wenn Sie andere Datenbankverbindungsdienste angeben müssen, stellen Sie diese über protected $connection -Eigenschaft des Modells fest:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Da der Datenbankverbindungsdienst angegeben werden kann, werden Multi-Database-Vorgänge natürlich unterstützt.
Das Modell konvertiert automatisch das Kamelformat des Klassennamens in das Unterstrichformat des entsprechenden Tabellennamens, z.
Wir können den Tabellennamen auch manuell über protected $table -Eigenschaft des Modells angeben:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; Sie können den Primärschlüssel auch über protected $primaryKey -Eigenschaft des Modells angeben, und der Standard -Primärschlüssel ist id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; Der Hauptschlüssel wird hauptsächlich für findById und findByIds -Funktionen verwendet.
Bitte wechseln Sie zu Soliphp/DB für die unterstützten Methoden des Soli -Modells.
Die Ansichtsdatei wird im View -Verzeichnis gespeichert, und die Verzeichnisstruktur, die dem Controller entspricht, und die Ansicht lautet:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
Controller App/Controller/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 ' );
}
}Dateiansicht anzeigen/user/view.twig, hier nehmen wir die Twig -Vorlage -Engine als Beispiel:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Weitere Möglichkeiten, um die Ansicht zu verwenden, wechseln Sie bitte zu Soliphp/Ansicht.
Danke fürs Lesen.