Soli เป็นเฟรมเวิร์ก PHP ที่มีน้ำหนักเบาซึ่งหมายถึงการออกแบบเฟรมเวิร์ก Phalcon และ Laravel และมีจุดประสงค์เพื่อให้เป็นคู่ที่ปรับขนาดได้ง่ายและใช้งานง่าย
MVC, การฉีดพึ่งพา, การจัดการเหตุการณ์, ข้อความแฟลช, เทมเพลตเอ็นจิ้น (twig, smarty) การกำหนดเส้นทาง, แอปพลิเคชันบรรทัดคำสั่งและฟังก์ชั่นอื่น ๆ
จากภาพด้านบนเราจะเห็นได้ว่ากระแสการประมวลผลของคำขอ SOLI คือ:
แอปพลิเคชันส่งคำขอ HTTP ที่ได้รับไปยังกระบวนการกำหนดเส้นทางและส่งผลการกำหนดเส้นทางไปยังตัวกำหนดตารางเวลาคอนโทรลเลอร์ คอนโทรลเลอร์ประมวลผลตรรกะทางธุรกิจของแอปพลิเคชันเรียกใช้โมเดลและมุมมองที่สอดคล้องกันและส่งคืนผลการประมวลผลไปยังแอปพลิเคชันผ่านตัวกำหนดตารางเวลาเพื่อดำเนินการห่อหุ้มการตอบกลับ HTTP สุดท้าย
นอกจากนี้ SOLI ยังมีกลไกส่วนประกอบที่จัดทำโดยคอนเทนเนอร์ฉีดพึ่งพาดังนั้นนักพัฒนาสามารถใช้บริการต่าง ๆ ในภาชนะบรรจุได้อย่างง่ายดายเมื่อพัฒนาส่วนประกอบ
ตัวจัดการเหตุการณ์ของ Soli ช่วยให้นักพัฒนาสามารถสกัดกั้นส่วนประกอบบางอย่างของเฟรมเวิร์กหรือแอปพลิเคชันโดยการสร้าง "hooks" เพื่อให้ได้ข้อมูลสถานะจัดการข้อมูลหรือเปลี่ยนโฟลว์การดำเนินการในกระบวนการส่วนประกอบที่แน่นอน
$ composer create-project soliphp/soliphp my-project
$ cp my-project/.env.example my-project/.env
$ php -S localhost:8000 -t my-project/public
การเข้าถึงเบราว์เซอร์ 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 函数对应的视图文件
โครงสร้างไดเรกทอรีไม่ได้รับการแก้ไข โครงสร้างไดเรกทอรีสามารถตกลงกันได้ตามความต้องการของโครงการจริงและพฤติกรรมการพัฒนาทีมและความหมายของแต่ละไดเรกทอรีสามารถกำหนดและแสดงออกได้
มีค่าคงที่พื้นฐานสองประการที่กำหนดไว้ใน bootstrap.php :
APP_PATH 对应 app 目录
BASE_PATH 项目根目录
ข้อมูลการกำหนดค่าพื้นฐานจะถูกเก็บไว้ในไฟล์ config/config.php โดยค่าเริ่มต้น:
<?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 เป็นเครื่องมือการจัดการแพ็คเกจที่ยอดเยี่ยมและแนวโน้มดังนั้น Soli จึงใช้นักแต่งเพลงสำหรับการจัดการโหลดอัตโนมัติและการจัดการการพึ่งพา
ใน pomposer.json ไดเรกทอรีแอพได้รับการกำหนดค่าเป็นเนมสเปซที่จุดเริ่มต้นของแอพ:
"autoload": {
"psr-4": {
"App\": "app/"
}
}
ดังนั้นคลาสที่กำหนดโดยกฎ PSR-4 ในไดเรกทอรีแอพสามารถโหลดได้โดยอัตโนมัติเมื่อมีการเรียกเช่นคอนโทรลเลอร์และไดเรกทอรีคอนโซล
วัตถุประสงค์ของคอนเทนเนอร์ฉีดพึ่งพาคือเพื่อลดการมีเพศสัมพันธ์ของรหัสและปรับปรุงการบำรุงรักษาของแอปพลิเคชัน แปลงการพึ่งพาระหว่างส่วนประกอบเป็นการพึ่งพาคอนเทนเนอร์และการจัดการบริการ (การสร้างการกำหนดค่าและการวางตำแหน่ง) จะดำเนินการผ่านคอนเทนเนอร์
การกำหนดค่าของบริการคอนเทนเนอร์จะถูกเก็บไว้ในไฟล์ config/services.php โดยค่าเริ่มต้น:
<?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 ;
});นอกจากนี้ Soli Web App จะลงทะเบียนบริการที่ใช้กันทั่วไปตามค่าเริ่มต้นสำหรับการใช้งานโดยตรงโดยคอนโทรลเลอร์และส่วนประกอบที่กำหนดเอง:
| ชื่อบริการ | แนะนำ | ค่าเริ่มต้น | เป็นบริการที่ใช้ร่วมกันหรือไม่? |
|---|---|---|---|
| เราเตอร์ | บริการเส้นทาง | Soli Web Router | ใช่ |
| ผู้ส่ง | บริการกำหนดเวลาคอนโทรลเลอร์ | soli dispatcher | ใช่ |
| ขอ | บริการสภาพแวดล้อม http คำขอ | Soli Web Request | ใช่ |
| การตอบสนอง | บริการสภาพแวดล้อมการตอบสนอง http | Soli Web Response | ใช่ |
| การประชุม | บริการเซสชัน | soli web เซสชัน | ใช่ |
| แฟลช | บริการข้อความแฟลช | soli web flash | ใช่ |
อนุญาตให้นักพัฒนาปรับแต่งบริการที่มีชื่อเดียวกันเพื่อแทนที่บริการเริ่มต้นด้านบน
ไฟล์รายการของเว็บแอปพลิเคชันจะถูกเก็บไว้ใน public/index.php โดยค่าเริ่มต้นและมีลักษณะเช่นนี้:
<?php
require dirname ( __DIR__ ) . ' /app/bootstrap.php ' ;
$ app = new Soli Web App ();
// 处理请求,输出响应内容
$ app -> handle ()-> send ();
$ app -> terminate ();คลาสคอนโทรลเลอร์เริ่มต้นเป็น "คอนโทรลเลอร์" และการกระทำไม่มีคำต่อท้าย
คอนโทรลเลอร์สามารถเข้าถึงบริการทั้งหมดที่ลงทะเบียนในคอนเทนเนอร์โดยการเข้าถึงคุณสมบัติ
<?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 ));
}
}โมเดล SOLI มีเพียงวิธีการทั่วไปสำหรับการใช้งานฐานข้อมูลและไม่ใช้ ORM สิ่งนี้ถูกกำหนดโดยแหล่งข้อมูลและสถาปัตยกรรมโครงการของเรา เป็นไปได้ว่าข้อมูลมาจากอินเทอร์เฟซระยะไกลและเป็นไปได้ว่าทีมคุ้นเคยกับการใช้หลักคำสอนมากขึ้น โซลีเคารพตัวเลือกของนักพัฒนาและนิสัยการใช้งานในสถานการณ์แอปพลิเคชันที่แตกต่างกันและให้วิธีการที่ง่ายต่อการปรับขนาดเพื่อให้คุณสามารถใช้เลเยอร์ข้อมูลที่เหมาะสมสำหรับทีมและความต้องการที่แท้จริง
ใช้โมเดล:
<?php
use Soli Model ;
class User extends Model
{
}ที่นี่เมื่อเรียกโมเดลผู้ใช้บริการชื่อ "DB" ในคอนเทนเนอร์จะถูกเรียกโดยค่าเริ่มต้นและชื่อตารางของการดำเนินการคือ "ผู้ใช้"
หากคุณต้องการระบุบริการเชื่อมต่อฐานข้อมูลอื่น ๆ ให้ตั้งค่าผ่านคุณสมบัติ protected $connection ของรุ่น:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;เนื่องจากสามารถระบุบริการการเชื่อมต่อฐานข้อมูลได้การดำเนินการแบบหลายฐานข้อมูลจึงได้รับการสนับสนุนตามธรรมชาติ
โมเดลจะแปลงรูปแบบอูฐของชื่อคลาสโดยอัตโนมัติเป็นรูปแบบขีดล่างของชื่อตารางที่สอดคล้องกันเช่นชื่อตารางที่จำไว้ที่ถูกแปลงโดยรุ่นเริ่มต้นคือ remember_token
นอกจากนี้เรายังสามารถระบุชื่อตารางด้วยตนเองผ่านคุณสมบัติ protected $table ของรุ่น:
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; นอกจากนี้คุณยังสามารถระบุคีย์หลักผ่านคุณสมบัติ protected $primaryKey ของโมเดลและคีย์หลักเริ่มต้นคือ id :
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; คีย์หลักส่วนใหญ่จะใช้สำหรับฟังก์ชั่น findById และ findByIds
โปรดย้ายไปที่ SOLIPHP/DB สำหรับวิธีการที่รองรับของโมเดล SOLI
ไฟล์มุมมองถูกเก็บไว้ในไดเรกทอรีมุมมองและโครงสร้างไดเรกทอรีที่สอดคล้องกับคอนโทรลเลอร์และมุมมองคือ:
├── app 应用程序目录
│ └── Controllers WEB应用控制器目录
│ └── UserController.php
└── views 视图文件目录
└── user UserController 对应的视图目录
└── view.twig view 函数对应的视图文件
แอพคอนโทรลเลอร์/คอนโทรลเลอร์/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 ' );
}
}ดูมุมมองไฟล์/ผู้ใช้/view.twig ที่นี่เราใช้เอ็นจินเทมเพลต Twig เป็นตัวอย่าง:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}สำหรับวิธีอื่น ๆ ในการใช้มุมมองโปรดย้ายไปที่ SOLIPHP/View
ขอบคุณสำหรับการอ่าน