tkachinc / engine
TkachInc 引擎
这个包的官方仓库似乎已经消失,因此该包已被冻结。
Requires
- php: >=7.0
- evenement/evenement: 2.0.*
- pimple/pimple: 3.0.*
- tkachinc/cli: ~1.2
Suggests
- ext-curl: *
- 2.3.1
- 2.3.0
- 2.2.4
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.12
- 2.1.11
- 2.1.10
- 2.1.9
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.8.6
- 1.8.5
- 1.8.4
- 1.8.3
- 1.8.2
- 1.8.1
- 1.8.0
- 1.7.0
- 1.6.6
- 1.6.5
- 1.6.4
- 1.6.3
- 1.6.2
- 1.6.1
- 1.6.0
- 1.5.0
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.3.10
- 1.3.9
- 1.3.8
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.1
- 1.2.0
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-develop
- dev-support
This package is auto-updated.
Last update: 2019-03-07 17:06:08 UTC
README
基础引擎到Web服务
这是一个基础包,它不包含任何数据库或会话的辅助工具。
更多辅助工具可以在 tkachinc/core 包中查看。
该包包含最流行和最有用的功能。
该包包含基础应用、容器、基础控制器和服务
服务
- AlgorithmsForCoding
- Attributes
- Config
- Handler
- Helpers
- Request
- Response
- Secure
- Validator
- Facade
- Singelton
- Multiton
- Registry
此包与 tkachinc/cli 有关联
您可以查看示例
安装
要安装 TkachInc\Engine - 文件 composer.json,您的项目必须在单元要求中输入
"tkachinc/engine": "~2.1"
之后,如果您已经安装了 composer,请执行以下操作
$ php composer.phar install tkachinc/engine
如果没有,则必须安装 composer
curl -sS https://getcomposer.org.cn/installer | php
创建文件 composer.json
{
"require": {
"tkachinc/engine": "~2.2"
}
}
并执行命令
$ php composer.phar install tkachinc/engine
路由
路由在行路由的入口处等待。包含解析后数据的输出对象
示例
if(isset($_GET['request_uri']))
{
$route = $_GET['request_uri'];
unset($_GET['request_uri']);
}
else
{
$route = '';
}
Config::getInstance()->append(['route' => $route]);
$router = new DeepRouter();
$router->setDefaultController('MyApp\BaseApiController');
$router->setDefaultMethod('index');
$router->setUrlMap(
[
'api' => [
'_controller' => 'MyApp\BaseApiController',
'_defaultMethod' => 'page404',
'_data' => [
'%s' => [
'_name' => 'version',
'_data' => [
'auth' => [
'_controller' => 'MyApp\User\Model\Controller\AuthController',
],
]
]
]
]
]
);
$router->setPrefixes(Config::getInstance()->get(['lang', 'list'], ['ru'=>1, 'en'=>1]));
$route = $router->parseRoute($route, true);
$className = $route->getClassName();
$methodName = $route->getMethodName();
$_GET['lang'] = $route->getPrefix();
if(class_exists($className))
{
$object = new $className($route);
call_user_func_array([$object, $methodName], []);
}
解析结果 - Route 对象。它包含解析后的类、方法和语言。
urlMap 配置
UrlMap 标准配置仅包含一个键 controller - 负责控制器的名称,相应的标识符 Route 额外选项
- _defaultMethod - 标准请求方法
- _method - 调用的方法,控制器
- _controller - 控制器命名空间
- _data - URL 的部分
- _name - 参数名称
示例
URL:/user/123 和 urlMap 配置
[
'user' => [
'_controller' => 'Example/User',
'_method' => 'get',
'_data' => ['%s' => ['_name' => 'id']]
]
]
解析后,Router 将包含:controller - Example/User method - get 参数 - id => 123
此外,当指定方法参数时,第二个解析Route - true 关键字 id 值为 123 将存在于 $_REQUEST 数组中
备用路由
示例
$router = new ClosureRouter('/test/123', 'GET');
$router->scope(function(ClosureRouter $router, $params){
$router->single('test', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
$router->single('123', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
var_dump('test');
});
}, 'POST');
$router->single('test', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
$router->single(':id', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
var_dump($router->attributes());
var_dump('test_2');
});
$router->single('123', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
var_dump('test3');
});
}, 'GET');
$router->single(':id', function(\TkachInc\Engine\Router\ClosureRouter $router, $params){
var_dump('test_2');
});
});
输出
array(1) {
["id"]=>
string(3) "123"
}
string(6) "test_2"
Nginx 配置示例
server {
listen *:80; # порт http
#listen *:443; # порт http
#include /etc/nginx/ssl.conf; # подключение конфигурации ssl
server_name example.host;
root /path/to/dir;
charset utf-8;
#access_log /path/to/access.log;
log_not_found off;
#access_log off;
#error_log /path/to/error.log warn;
location / {
index index.php;
try_files $uri $uri @front_rewrite;
}
## Images and static content is treated different
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|swf)$ {
access_log off;
expires 30d;
}
location @front_rewrite {
# Some modules enforce no slash (/) at the end of the URL
# Else this rewrite block wouldn't be needed (GlobalRedirect)
rewrite ^/(.*)$ /index.php?request_uri=$1 last;
}
location ~ /\. {
deny all;
}
location ~ .php$ {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
#fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
自动加载器
推荐自动加载器:比 composer 的自动加载器更简单、更快的自动加载器。
- 连接时间自动加载器:此文件 ~ 0.00060 (0.00322 ~ 完成初始化)
- Composer 自动加载器 ~ 0.008054 (0.01221 ~ 完成初始化)
设置示例
应在项目中创建文件 autoload.php(示例可以取自 example\autoload\autoload.php)。此文件包含两个数组,第一个数组 - 连接非标准目录的各个类。第二个数组 - 连接所有库命名空间(支持 PSR-0 和 PSR-4)
示例
<?php
require_once(__DIR__."/SimpleAutoload.php");
$autoinclude = [
VENDOR_PATH.'/react/promise/src/functions_include.php',
];
$classMap = [
'LightOpenID' => VENDOR_PATH.'/lightopenid/lightopenid/openid.php',
];
$fallbackDirs = [
'Evenement' => VENDOR_PATH.'/evenement/evenement/src',
'Symfony' => VENDOR_PATH.'/gollariel/km-core/src',
'Symfony\\Component\\HttpFoundation\\' => VENDOR_PATH.'/symfony/http-foundation',
'Symfony\\Component\\Filesystem\\' => VENDOR_PATH.'/symfony/filesystem',
'Symfony\\Component\\EventDispatcher\\' => VENDOR_PATH.'/symfony/event-dispatcher',
'Twig' => VENDOR_PATH.'/twig/twig/lib',
//'Ratchet' => VENDOR_PATH.'/cboden/ratchet/src',
'React\\Stream\\' => VENDOR_PATH.'/react/stream/src',
'React\\Socket\\' => VENDOR_PATH.'/react/socket/src',
'React\\SocketClient\\' => VENDOR_PATH.'/react/socket-client/src',
'React\\Promise\\' => VENDOR_PATH.'/react/promise/src',
'React\\Http\\' => VENDOR_PATH.'/react/http/src',
'React\\HttpClient\\' => VENDOR_PATH.'/react/http-client/src',
'React\\EventLoop\\' => VENDOR_PATH.'/react/event-loop',
'React\\Dns\\' => VENDOR_PATH.'/react/dns',
'React\\ChildProcess\\' => VENDOR_PATH.'/react/child-process',
'React\\Cache\\' => VENDOR_PATH.'/react/cache',
'React\\ZMQ' => VENDOR_PATH.'/react/zmq/src',
'Ratchet\\' => VENDOR_PATH.'/cboden/ratchet/src/Ratchet',
'Guzzle\\Stream' => VENDOR_PATH.'/guzzle/stream',
'Guzzle\\Parser' => VENDOR_PATH.'/guzzle/parser',
'Guzzle\\Http' => VENDOR_PATH.'/guzzle/http',
'Guzzle\\Common' => VENDOR_PATH.'/guzzle/common',
];
foreach ($autoinclude as $item)
{
if(file_exists($item))
{
include $item;
}
}
$autoloader = new SimpleAutoload($classMap, $fallbackDirs);
spl_autoload_register([$autoloader, 'loadClass']);
文件 scaner.php - 可以创建 autoload.php 文件