Soli est un cadre PHP léger, qui fait référence à la conception du cadre Phalcon et Laravel, et est destiné à être couplé vaguement, évolutif, simple et facile à utiliser.
MVC, injection de dépendance, gestion d'événements, messages flash, modèle de moteur (brin, smarty), application de ligne de commande et autres fonctions
Depuis l'image ci-dessus, nous pouvons voir que le flux de traitement de la demande Soli est:
La demande remet la demande HTTP reçue au processus de routage et remet le résultat de routage vers le planificateur de contrôleur; Le contrôleur traite la logique métier de l'application, appelle le modèle et la vue correspondants, et renvoie le résultat de traitement à l'application via le planificateur pour effectuer l'encapsulation finale de réponse HTTP.
De plus, Soli fournit des mécanismes de composants fournis par les conteneurs d'injection de dépendance, afin que les développeurs puissent facilement utiliser divers services dans le conteneur lors du développement de composants.
Le gestionnaire d'événements de Soli permet aux développeurs d'intercepter certaines composants du cadre ou de l'application en créant des "crochets". Afin d'obtenir des informations d'état, de manipuler des données ou de modifier le flux d'exécution dans un certain processus de composant.
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
Accès du navigateur 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 函数对应的视图文件
La structure du répertoire n'est pas fixe. La structure du répertoire peut être convenu en fonction des besoins réels du projet et des habitudes de développement d'équipe, et la signification de chaque répertoire peut être définie et exprimée.
Il existe deux constantes de base définies dans bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
Les informations de configuration de base sont stockées dans le fichier config/config.php par défaut:
<?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 ' ,
),
// 更多...
);Le compositeur est un excellent outil de gestion des packages et une tendance, donc Soli utilise le compositeur pour le chargement automatique et la gestion des dépendances.
Dans Composer.json, le répertoire de l'application est configuré comme l'espace de noms au début de l'application:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Par conséquent, les classes définies par les règles PSR-4 dans le répertoire de l'APP peuvent être automatiquement chargées lorsqu'elles sont appelées, comme les contrôleurs et les répertoires de console.
L'objectif du conteneur d'injection de dépendance est de réduire le couplage du code et d'améliorer la maintenabilité de l'application. Transformer les dépendances entre les composants en dépendances sur les conteneurs, et la gestion des services (création, configuration et positionnement) est effectuée via des conteneurs.
La configuration du service de conteneur est stockée dans le fichier config/services.php par défaut:
<?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 ;
});De plus, Soli Web App enregistre les services couramment utilisés par défaut pour une utilisation directe par les contrôleurs et les composants personnalisés:
| Nom de service | introduire | défaut | Est-ce un service partagé? |
|---|---|---|---|
| routeur | Services de routage | Soli web routeur | Oui |
| répartiteur | Service de planification du contrôleur | Soli Dispatcher | Oui |
| demande | Service d'environnement de demande HTTP | Soli Web Demande | Oui |
| Réponse | Service d'environnement de réponse HTTP | Soli Web Response | Oui |
| session | Services de session | Soli Web Session | Oui |
| éclair | Service de messages flash | Soli Web Flash | Oui |
Permettez aux développeurs de personnaliser les services avec le même nom pour remplacer les services par défaut ci-dessus.
Les fichiers d'entrée de l'application Web sont stockés dans public/index.php par défaut et ressemblent à ceci:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();La classe de contrôleur par défaut "Controller" et l'action n'ont pas de suffixe.
Le contrôleur peut accéder à tous les services enregistrés dans le conteneur en accédant aux propriétés.
<?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 ));
}
}Le modèle SOLI fournit uniquement quelques méthodes courantes pour les bases de données de fonctionnement et n'implémente pas ORM. Ceci est déterminé par notre source de données et notre architecture de projet. Il est possible que les données proviennent d'une interface distante, et il est également possible que l'équipe soit plus habituée à l'utilisation de la doctrine. Soli respecte les choix et les habitudes d'utilisation des développeurs dans différents scénarios d'application et fournit des méthodes faciles à échelle pour vous permettre de mettre en œuvre des couches de données adaptées aux équipes et aux besoins réels.
Utilisation du modèle:
<?php
use Soli Model ;
class User extends Model
{
}Ici, lors de l'appel du modèle utilisateur, le service nommé "db" dans le conteneur sera appelé par défaut, et le nom de la table de l'opération est "utilisateur".
Si vous devez spécifier d'autres services de connexion de la base de données, définissez-le via protected $connection du modèle:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Étant donné que le service de connexion de base de données peut être spécifié, les opérations multi-données sont naturellement prises en charge.
Le modèle convertira automatiquement le format de chameau du nom de classe au format de soulignement du nom de table correspondant, tel que le nom de la table RememberToken converti par le modèle par défaut est relevel_token.
Nous pouvons également spécifier manuellement le nom de la table via protected $table du modèle:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; Vous pouvez également spécifier la clé primaire via protected $primaryKey du modèle, et la clé principale par défaut est id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; La clé primaire est principalement utilisée pour les fonctions findById et findByIds .
Veuillez vous déplacer vers Soliphp / DB pour les méthodes prises en charge du modèle SOLI.
Le fichier de vue est stocké dans le répertoire des vues, et la structure du répertoire correspondant au contrôleur et la vue est:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
Controller App / 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 ' );
}
}Afficher les vues du fichier / user / view.twig, nous prenons ici le moteur du modèle de brindille à titre d'exemple:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Pour plus de façons d'utiliser la vue, veuillez passer à Soliphp / View.
Merci d'avoir lu.