Soli adalah kerangka kerja PHP yang ringan, yang mengacu pada desain kerangka phalcon dan Laravel, dan dimaksudkan untuk digabungkan secara longgar, dapat diskalakan, sederhana dan mudah digunakan.
MVC, Injeksi Ketergantungan, Manajemen Acara, Pesan Flash, Mesin Template (Twig, Smarty) Routing, aplikasi baris perintah dan fungsi lainnya
Dari gambar di atas kita dapat melihat bahwa aliran pemrosesan permintaan soli adalah:
Aplikasi menyerahkan permintaan HTTP yang diterima ke proses perutean dan menyerahkan hasil perutean ke penjadwal pengontrol; Pengontrol memproses logika bisnis aplikasi, memanggil model dan tampilan yang sesuai, dan mengembalikan hasil pemrosesan ke aplikasi melalui penjadwal untuk melakukan enkapsulasi respons HTTP akhir.
Selain itu, Soli menyediakan mekanisme komponen yang disediakan oleh wadah injeksi ketergantungan, sehingga pengembang dapat dengan mudah menggunakan berbagai layanan dalam wadah saat mengembangkan komponen.
Manajer acara Soli memungkinkan pengembang untuk mencegat beberapa komponen kerangka kerja atau aplikasi dengan membuat "kait". Untuk mendapatkan informasi status, memanipulasi data, atau mengubah aliran eksekusi dalam proses komponen tertentu.
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
Akses browser 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 函数对应的视图文件
Struktur direktori tidak diperbaiki. Struktur direktori dapat disepakati sesuai dengan kebutuhan proyek yang sebenarnya dan kebiasaan pengembangan tim, dan makna setiap direktori dapat didefinisikan dan diungkapkan.
Ada dua konstanta dasar yang didefinisikan dalam bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
Informasi konfigurasi dasar disimpan dalam file config/config.php secara default:
<?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 adalah alat manajemen paket yang sangat baik dan tren, sehingga Soli menggunakan komposer untuk pemuatan otomatis dan manajemen ketergantungan.
Di composer.json, direktori aplikasi dikonfigurasi sebagai namespace di awal aplikasi:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
Oleh karena itu, kelas yang ditentukan oleh aturan PSR-4 dalam direktori aplikasi dapat secara otomatis dimuat ketika dipanggil, seperti pengontrol dan direktori konsol.
Tujuan dari wadah injeksi ketergantungan adalah untuk mengurangi kopling kode dan meningkatkan pemeliharaan aplikasi. Transformasi dependensi antara komponen ke dalam dependensi pada wadah, dan manajemen layanan (pembuatan, konfigurasi dan penentuan posisi) dilakukan melalui wadah.
Konfigurasi layanan kontainer disimpan dalam file config/services.php secara default:
<?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 ;
});Selain itu, App Soli Web mendaftarkan layanan yang umum digunakan secara umum secara default untuk penggunaan langsung oleh pengontrol dan komponen khusus:
| Nama Layanan | memperkenalkan | bawaan | Apakah ini layanan bersama? |
|---|---|---|---|
| router | Layanan perutean | Soli web router | Ya |
| operator | Layanan Penjadwalan Pengontrol | Soli Dispatcher | Ya |
| meminta | Layanan Lingkungan Permintaan HTTP | Soli Web Request | Ya |
| Tanggapan | Layanan Lingkungan Respons HTTP | Soli Web Respons | Ya |
| sidang | Layanan Sesi | Sesi web sesi | Ya |
| kilatan | Layanan Pesan Flash | Soli web flash | Ya |
Izinkan pengembang untuk menyesuaikan layanan dengan nama yang sama untuk mengganti layanan default di atas.
File entri aplikasi web disimpan di public/index.php secara default, dan terlihat seperti ini:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();Kelas pengontrol default ke "controller" dan tindakan tidak memiliki akhiran.
Pengontrol dapat mengakses semua layanan yang terdaftar dalam wadah dengan mengakses properti.
<?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 ));
}
}Model Soli hanya menyediakan beberapa metode umum untuk basis data operasi dan tidak mengimplementasikan ORM. Ini ditentukan oleh sumber data dan arsitektur proyek kami. Ada kemungkinan bahwa data berasal dari antarmuka jarak jauh, dan mungkin juga tim lebih terbiasa menggunakan doktrin. Soli menghormati pilihan pengembang dan kebiasaan penggunaan dalam skenario aplikasi yang berbeda, dan menyediakan metode yang mudah dit-scaling untuk memungkinkan Anda menerapkan lapisan data yang cocok untuk tim dan kebutuhan aktual.
Menggunakan model:
<?php
use Soli Model ;
class User extends Model
{
}Di sini, saat memanggil model pengguna, layanan bernama "DB" di wadah akan dipanggil secara default, dan nama tabel operasi adalah "pengguna".
Jika Anda perlu menentukan layanan koneksi database lainnya, atur melalui properti protected $connection dari model:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;Karena layanan koneksi basis data dapat ditentukan, operasi multi-database didukung secara alami.
Model akan secara otomatis mengonversi format unta dari nama kelas ke format garis bawah dari nama tabel yang sesuai, seperti nama tabel RememberToken yang dikonversi oleh model default adalah Remember_Token.
Kami juga dapat secara manual menentukan nama tabel melalui properti protected $table dari model:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; Anda juga dapat menentukan kunci utama melalui properti protected $primaryKey dari model, dan kunci utama default adalah id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; Kunci utama terutama digunakan untuk fungsi findById dan findByIds .
Harap pindah ke Soliphp/dB untuk metode yang didukung dari model soli.
File tampilan disimpan di direktori tampilan, dan struktur direktori yang sesuai dengan pengontrol dan tampilannya adalah:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
Aplikasi/Pengontrol Pengontrol/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 ' );
}
}Lihat Tampilan File/Pengguna/View.twig, di sini kita mengambil mesin Template Twig sebagai contoh:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}Untuk lebih banyak cara menggunakan tampilan, silakan pindah ke Soliphp/View.
Terima kasih telah membaca.