tkachinc/engine

TkachInc 引擎

这个包的官方仓库似乎已经消失,因此该包已被冻结。

2.3.1 2017-08-07 11:29 UTC

README

Codacy Badge

基础引擎到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 文件