Soli는 Phalcon 및 Laravel 프레임 워크의 설계를 나타내는 가벼운 PHP 프레임 워크이며 느슨하게 결합되고 확장 가능하며 간단하며 사용하기 쉽습니다.
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은 컨트롤러 및 사용자 정의 구성 요소가 직접 사용하기 위해 기본적으로 다음으로 사용되는 서비스를 기본적으로 등록합니다.
| 서비스 이름 | 소개하다 | 기본 | 공유 서비스입니까? |
|---|---|---|---|
| 라우터 | 라우팅 서비스 | 솔리 웹 라우터 | 예 |
| 디스패처 | 컨트롤러 스케줄링 서비스 | 솔리 디스패처 | 예 |
| 요구 | HTTP 요청 환경 서비스 | Soli Web 요청 | 예 |
| 응답 | HTTP 응답 환경 서비스 | Soli Web 응답 | 예 |
| 세션 | 세션 서비스 | 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을 구현하지 않습니다. 이것은 데이터 소스 및 프로젝트 아키텍처에 의해 결정됩니다. 데이터가 원격 인터페이스에서 나올 수도 있으며 팀이 교리 사용에 더 익숙 할 수도 있습니다. Soli는 다양한 응용 프로그램 시나리오에서 개발자의 선택 및 사용 습관을 존중하며 스케일링하기 쉬운 방법을 제공하여 팀과 실제 요구에 적합한 데이터 계층을 구현할 수 있습니다.
모델 사용 :
<?php
use Soli Model ;
class User extends Model
{
}여기서 사용자 모델을 호출 할 때 컨테이너의 "DB"라는 서비스는 기본적으로 호출되며 작업 테이블 이름은 "사용자"입니다.
다른 데이터베이스 연결 서비스를 지정 해야하는 경우 모델 protected $connection 속성을 통해 설정하십시오.
/**
* 当前模型访问的数据库连接服务名称
*/
protected $ connection = ' user_db ' ;데이터베이스 연결 서비스를 지정할 수 있으므로 다중 대사 작업이 자연스럽게 지원됩니다.
모델은 클래스 이름의 낙타 형식을 자동으로 해당 테이블 이름의 밑줄 형식으로 자동 변환합니다. 예를 들어 기본 모델로 변환되는 Remembertoken 테이블 이름과 같은 기본 모델은 regree_token입니다.
또한 모델의 protected $table 속성을 통해 테이블 이름을 수동으로 지정할 수도 있습니다.
/**
* 当前模型操作的表名
*/
protected $ table = ' xxx_user ' ; 모델의 protected $primaryKey 속성을 통해 기본 키를 지정할 수도 있고 기본 기본 키는 id 입니다.
/**
* 当前模型所操作表的主键
*/
protected $ primaryKey = ' xxx_id ' ; 기본 키는 주로 findById 및 findByIds 기능에 사용됩니다.
지원되는 Soli 모델 방법은 Soliphp/DB로 이동하십시오.
보기 파일은 뷰 디렉토리에 저장되며 컨트롤러에 해당하는 디렉토리 구조는 다음과 같습니다.
├── 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 Engine을 예로 들어 본다.
用户姓名:{{ user . name }}
用户邮箱:{{ user . email }}
{{ flash. output () }}보기를 더 많이 사용하는 방법은 Soliphp/View로 이동하십시오.
읽어 주셔서 감사합니다.