Soli هو إطار PHP خفيف الوزن ، والذي يشير إلى تصميم إطار Phalcon و Laravel ، ويهدف إلى أن يكون مقترنًا بشكل فضفاض وقابل للتطوير وسهل الاستخدام.
MVC ، حقن التبعية ، إدارة الأحداث ، رسائل الفلاش ، محرك القالب (TWIG ، SMARTY) ، تطبيق سطر الأوامر والوظائف الأخرى
من الصورة أعلاه ، يمكننا أن نرى أن تدفق معالجة طلب Soli هو:
يقوم التطبيق بتسليم طلب HTTP المستلم إلى عملية التوجيه ويسلم نتيجة التوجيه إلى جدولة وحدة التحكم ؛ تقوم وحدة التحكم بمعالجة منطق أعمال التطبيق ، وتدعو النموذج المقابل وعرضه ، ويعيد نتيجة المعالجة إلى التطبيق من خلال المجدول لأداء تغليف استجابة HTTP النهائي.
بالإضافة إلى ذلك ، يوفر Soli آليات مكونات توفرها حاويات حقن التبعية ، بحيث يمكن للمطورين بسهولة استخدام خدمات مختلفة في الحاوية عند تطوير المكونات.
يتيح مدير الأحداث في Soli للمطورين اعتراض بعض مكونات الإطار أو التطبيق عن طريق إنشاء "خطافات". من أجل الحصول على معلومات الحالة ، أو معالجة البيانات ، أو تغيير تدفق التنفيذ في عملية مكون معين.
$ 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 الملحن للتحميل التلقائي وإدارة التبعية.
في composer.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 Session | نعم |
| فلاش | خدمة رسائل فلاش | 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. يتم تحديد ذلك من خلال مصدر البيانات والهندسة المعمارية للمشروع. من الممكن أن تأتي البيانات من واجهة بعيدة ، ومن الممكن أيضًا أن يكون الفريق أكثر اعتمادًا على استخدام العقيدة. يحترم Soli خيارات المطورين وعادات الاستخدام في سيناريوهات التطبيق المختلفة ، ويوفر طرقًا سهلة التمكين لتمكينك من تنفيذ طبقات البيانات المناسبة للفرق والاحتياجات الفعلية.
باستخدام النموذج:
<?php
use Soli Model ;
class User extends Model
{
}هنا ، عند الاتصال بنموذج المستخدم ، سيتم استدعاء الخدمة المسماة "DB" في الحاوية افتراضيًا ، واسم الجدول للعملية هو "مستخدم".
إذا كنت بحاجة إلى تحديد خدمات اتصال قاعدة البيانات الأخرى ، فقم بتعيينها من خلال خاصية protected $connection للنموذج:
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;نظرًا لأنه يمكن تحديد خدمة اتصال قاعدة البيانات ، يتم دعم العمليات المتعددة database بشكل طبيعي.
سيقوم النموذج تلقائيًا بتحويل تنسيق الجمل لاسم الفئة إلى تنسيق السفة السفلية لاسم الجدول المقابل ، مثل اسم جدول TermeRtoken الذي يتم تحويله بواسطة النموذج الافتراضي.
يمكننا أيضًا تحديد اسم الجدول يدويًا من خلال خاصية 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 Template كمثال:
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}لمزيد من الطرق لاستخدام العرض ، يرجى الانتقال إلى soliphp/العرض.
شكرا لك على القراءة.