O Soli é uma estrutura leve PHP, que se refere ao design da estrutura Phalcon e Laravel, e deve ser vagamente acoplada, escalável, simples e fácil de usar.
MVC, Injeção de Dependência, Gerenciamento de Eventos, Mensagens Flash, Motor de Modelo (Twig, Smarty) Routing, Aplicativo da linha de comando e outras funções
A partir da imagem acima, podemos ver que o fluxo de processamento da solicitação Soli é:
O aplicativo entrega a solicitação HTTP recebida ao processo de roteamento e entrega o resultado de roteamento ao agendador do controlador; O controlador processa a lógica de negócios do aplicativo, chama o modelo e a visualização correspondentes e retorna o resultado do processamento ao aplicativo através do agendador para executar o encapsulamento final da resposta HTTP.
Além disso, o Soli fornece mecanismos de componentes fornecidos por recipientes de injeção de dependência, para que os desenvolvedores possam usar facilmente vários serviços no contêiner ao desenvolver componentes.
O gerente de eventos da Soli permite que os desenvolvedores interceptem alguns componentes da estrutura ou aplicativo criando "ganchos". Para obter informações de status, manipular dados ou alterar o fluxo de execução em um determinado processo 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
Acesso ao 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 函数对应的视图文件
A estrutura do diretório não é fixa. A estrutura do diretório pode ser acordada de acordo com as necessidades reais do projeto e os hábitos de desenvolvimento da equipe, e o significado de cada diretório pode ser definido e expresso.
Existem duas constantes básicas definidas no bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
As informações básicas de configuração são armazenadas no arquivo config/config.php por padrão:
<?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 ' ,
),
// 更多...
);O Composer é uma excelente ferramenta de gerenciamento de pacotes e uma tendência, portanto, o Soli usa o Composer para gerenciamento automático de carregamento e dependência.
Em Composer.json, o diretório de aplicativos é configurado como o espaço para nome no início do aplicativo:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Portanto, as classes definidas pelas regras do PSR-4 no diretório de aplicativos podem ser carregadas automaticamente quando chamadas, como os controladores e os diretórios de console.
O objetivo do contêiner de injeção de dependência é reduzir o acoplamento do código e melhorar a manutenção do aplicativo. Transforme as dependências entre os componentes em dependências dos contêineres e o gerenciamento de serviços (criação, configuração e posicionamento) é realizado através de contêineres.
A configuração do serviço de contêiner é armazenada no arquivo config/services.php por padrão:
<?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 ;
});Além disso, o aplicativo Soli Web registra os seguintes serviços comumente usados por padrão para uso direto por controladores e componentes personalizados:
| Nome do serviço | introduzir | padrão | É um serviço compartilhado? |
|---|---|---|---|
| roteador | Serviços de roteamento | Soli Web Router | sim |
| expedidor | Serviço de agendamento do controlador | Soli Dispatcher | sim |
| solicitar | Serviço de ambiente de solicitação http | Soli web request | sim |
| Resposta | Serviço de ambiente de resposta HTTP | Soli Web Response | sim |
| sessão | Serviços de sessão | Soli Web Sessão | sim |
| clarão | Serviço de mensagem flash | Soli web flash | sim |
Permita que os desenvolvedores personalizem serviços com o mesmo nome para substituir os serviços padrão acima.
Os arquivos de entrada do aplicativo da web são armazenados em public/index.php por padrão, e se parecem com o seguinte:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();A classe do controlador é padronizada para "controlador" e a ação não tem sufixo.
O controlador pode acessar todos os serviços registrados no contêiner acessando propriedades.
<?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 ));
}
}O modelo Soli fornece apenas alguns métodos comuns para operar bancos de dados e não implementa ORM. Isso é determinado por nossa fonte de dados e arquitetura do projeto. É possível que os dados venham de uma interface remota e também é possível que a equipe esteja mais acostumada a usar a doutrina. Soli respeita as escolhas e hábitos de uso dos desenvolvedores em diferentes cenários de aplicação e fornece métodos fáceis de escalar para permitir que você implemente camadas de dados adequadas para equipes e necessidades reais.
Usando o modelo:
<?php
use Soli Model ;
class User extends Model
{
}Aqui, ao chamar o modelo do usuário, o serviço chamado "db" no contêiner será chamado por padrão, e o nome da tabela da operação é "usuário".
Se você precisar especificar outros serviços de conexão com o banco de dados, defina -o através protected $connection do modelo:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Como o serviço de conexão com o banco de dados pode ser especificado, as operações com vários dados são suportados naturalmente.
O modelo converterá automaticamente o formato de camelo do nome da classe para o formato sublinhado do nome da tabela correspondente, como o nome da tabela RememberToken que é convertido pelo modelo padrão é REMING.
Também podemos especificar manualmente o nome da tabela através protected $table DO MODELO:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; Você também pode especificar a chave primária através protected $primaryKey do modelo, e a chave primária padrão é id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; A chave primária é usada principalmente para as funções findById e findByIds .
Por favor, mova para Soliphp/dB para os métodos suportados do modelo Soli.
O arquivo de exibição é armazenado no diretório de visualizações e a estrutura do diretório correspondente ao controlador e a visualização é:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
App/controladores controladores/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 ' );
}
}Exibir o arquivo Views/User/View.twig, aqui pegamos o mecanismo do modelo Twig como exemplo:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Para mais maneiras de usar a visualização, mova -se para Soliphp/View.
Obrigado pela leitura.