Soli es un marco PHP liviano, que se refiere al diseño del marco Phalcon y Laravel, y está destinado a ser libremente acoplado, escalable, simple y fácil de usar.
MVC, inyección de dependencia, gestión de eventos, mensajes flash, enrutamiento de motor de plantilla (Twig, Smarty), aplicación de línea de comandos y otras funciones
De la imagen de arriba podemos ver que el flujo de procesamiento de la solicitud SOLI es:
La aplicación entrega la solicitud HTTP recibida al proceso de enrutamiento y entrega el resultado de enrutamiento al planificador del controlador; El controlador procesa la lógica comercial de la aplicación, llama al modelo y vista correspondientes, y devuelve el resultado de procesamiento a la aplicación a través del programador para realizar la encapsulación final de respuesta HTTP.
Además, SOLI proporciona mecanismos de componentes proporcionados por contenedores de inyección de dependencia, por lo que los desarrolladores pueden usar fácilmente varios servicios en el contenedor al desarrollar componentes.
El administrador de eventos de Soli permite a los desarrolladores interceptar algunos componentes del marco o la aplicación creando "ganchos". Para obtener información de estado, manipular datos o cambiar el flujo de ejecución en un cierto proceso de componente.
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
Acceso al navegador 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 estructura del directorio no es fija. La estructura del directorio se puede acordar de acuerdo con las necesidades reales del proyecto y los hábitos de desarrollo del equipo, y el significado de cada directorio puede definirse y expresarse.
Hay dos constantes básicas definidas en bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
La información de configuración básica se almacena en el archivo config/config.php de forma predeterminada:
<?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 ' ,
),
// 更多...
);El compositor es una excelente herramienta de gestión de paquetes y una tendencia, por lo que Soli utiliza compositor para la carga automática y la gestión de dependencias.
En composer.json, el directorio de aplicaciones está configurado como el espacio de nombres al comienzo de la aplicación:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Por lo tanto, las clases definidas por las reglas PSR-4 en el directorio de aplicaciones se pueden cargar automáticamente cuando se les llama, como los controladores y los directorios de consola.
El propósito del contenedor de inyección de dependencia es reducir el acoplamiento del código y mejorar la capacidad de mantenimiento de la aplicación. Transforma las dependencias entre componentes en dependencias de contenedores y la gestión de servicios (creación, configuración y posicionamiento) se realiza a través de contenedores.
La configuración del servicio de contenedor se almacena en el archivo config/services.php de forma predeterminada:
<?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 ;
});Además, Soli Web App registra los siguientes servicios utilizados de forma predeterminada para uso directo por controladores y componentes personalizados:
| Nombre de servicio | introducir | por defecto | ¿Es un servicio compartido? |
|---|---|---|---|
| enrutador | Servicios de enrutamiento | Soli web enrutador | Sí |
| transportista | Servicio de programación del controlador | Soli despachador | Sí |
| pedido | Servicio de entorno de solicitud HTTP | Soli web solicitud | Sí |
| Respuesta | Servicio de entorno de respuesta HTTP | Soli web respuesta | Sí |
| sesión | Servicios de sesión | Soli web session | Sí |
| destello | Servicio de mensajes flash | Soli web flash | Sí |
Permita que los desarrolladores personalicen los servicios con el mismo nombre para anular los servicios predeterminados anteriores.
Los archivos de entrada de la aplicación web se almacenan en public/index.php de forma predeterminada y se ven así:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();La clase de controlador predeterminada al "controlador" y la acción no tiene sufijo.
El controlador puede acceder a todos los servicios registrados en el contenedor accediendo a las propiedades.
<?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 ));
}
}El modelo SOLI solo proporciona algunos métodos comunes para operar bases de datos y no implementa ORM. Esto está determinado por nuestra fuente de datos y arquitectura del proyecto. Es posible que los datos provengan de una interfaz remota, y también es posible que el equipo esté más acostumbrado a usar doctrina. Soli respeta las elecciones y los hábitos de uso de los desarrolladores en diferentes escenarios de aplicaciones, y proporciona métodos fáciles de escala para permitirle implementar capas de datos adecuadas para equipos y necesidades reales.
Usando el modelo:
<?php
use Soli Model ;
class User extends Model
{
}Aquí, al llamar al modelo de usuario, el servicio llamado "DB" en el contenedor se llamará de forma predeterminada, y el nombre de la tabla de la operación es "Usuario".
Si necesita especificar otros servicios de conexión de base de datos, configúrelo a través de protected $connection del modelo:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Dado que se puede especificar el servicio de conexión de la base de datos, las operaciones de múltiples databasas son compatibles naturalmente.
El modelo convertirá automáticamente el formato de camello del nombre de clase en el formato subrayado del nombre de la tabla correspondiente, como el nombre de la tabla RememberToken que se convierte en el modelo predeterminado es Remember_Token.
También podemos especificar manualmente el nombre de la tabla a través de protected $table del modelo:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; También puede especificar la clave principal a través de protected $primaryKey del modelo, y la clave primaria predeterminada es id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; La clave principal se usa principalmente para findById y findByIds Functions.
Muévase a SOLIPHP/DB para los métodos compatibles del modelo SOLI.
El archivo de vista se almacena en el directorio de vistas, y la estructura del directorio correspondiente al controlador y la vista es:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
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 ' );
}
}Ver vistas de archivo/usuario/ver.twig, aquí tomamos el motor de plantilla de twig como ejemplo:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Para obtener más formas de usar la vista, muévase a SOLIPHP/View.
Gracias por leer.