psg/sr2-implementation

应用标准化原型

0.1 2021-07-14 23:05 UTC

This package is auto-updated.

Last update: 2024-09-15 06:20:23 UTC


README

composer require psg/sr2-implementation

此实现的目的是提供一个详细文档的原型,展示如何实现分层应用。据我所知,将普通中间件与前端和后端集成的高复杂性一直是这一目标未能实现的原因。

备注

在我的实现中,我提供了带参数的调用函数($request, $response, $app)。然而,框架可能希望

  • 根据需要将参数注入到核心调用中
  • 如果核心是可实例化的,则将其注入到 __construct 中。因此,参数的设置取决于框架。

可能的改进

  • 使用依赖注入在 __construct 中进行即时中间件构建
  • 如果某个中间件在其阶段之后被添加,则添加异常

用法

查看所有层,这些层被设置为输出自我声明,并为每个添加一个标题

use Psg\Sr1\Implementation\Factory\Sr1Factory;
use Psg\Sr2\Implementation\{Beforeware, Frontware, Middleware, Backware, Afterware, LayeredApp};

$core = function($request, $response, $app){
	echo "Request Headers:\n";
	var_export($request->getHeaders());
	echo "\nadding body\n";
	return $response->withBodyString("\nBODY\n");
};

$App = new LayeredApp;
$App->add(new Beforeware);
$App->add(new Frontware);
$App->add(new Middleware);
$App->add(new Middleware);
$App->add(new Backware);
$App->add(new Afterware);
$App->core($core);

$Factory = new Sr1Factory();
$request = $Factory->createServerRequest('GET', 'http://bobery.com');
$App->handle($request);

/*>
Before
Front
Middle
wrap1{
Middle
wrap2{
Request Headers:
array (
  'Host' =>
  array (
    0 => 'bobery.com',
  ),
  'frontware' =>
  array (
    0 => '1',
  ),
  'middleware' =>
  array (
    0 => '1',
    1 => '2',
  ),
)
adding body
}wrap2
}wrap1
Back

==========RESPONSE {=============
array (
  'middleware' =>
  array (
    0 => '2',
    1 => '1',
  ),
  'Backware' =>
  array (
    0 => '1',
  ),
)wrap1{
wrap2{

BODY
}wrap2
}wrap1

==========} RESPONSE=============
After
*/

查看在特定阶段退出的能力

# Exit in frontware
$App = new LayeredApp;
$App->add(new Beforeware);
$App->add(new Frontware(['exit'=>true]));
$App->add(new Middleware);
$App->add(new Middleware);
$App->add(new Backware);
$App->add(new Afterware);
$App->core($core);
/*>
Before
Front
Back

==========RESPONSE {=============
array (
  'exit_at' =>
  array (
    0 => 'frontware',
  ),
  'Backware' =>
  array (
    0 => '1',
  ),
)
==========} RESPONSE=============
After
*/

# Exit in middleware
$App = new LayeredApp;
$App->add(new Beforeware);
$App->add(new Frontware);
$App->add(new Middleware(['exit'=>true]));
$App->add(new Middleware);
$App->add(new Backware);
$App->add(new Afterware);
$App->core($core);

/*>
Before
Front
Middle
Back

==========RESPONSE {=============
array (
  'exit_at' =>
  array (
    0 => 'middleware id 1',
  ),
  'Backware' =>
  array (
    0 => '1',
  ),
)
==========} RESPONSE=============
After
*/