psg/psr-102-implementation

0.1 2021-07-11 23:34 UTC

This package is auto-updated.

Last update: 2024-09-12 06:34:38 UTC


README

此实现的目的是提供一个详细文档的原型,展示如何实现分层应用。据我所知,将常规中间件与前端和后端集成带来的复杂性,一直是阻止实现此功能的原因,这使得本例变得尤为重要。

备注

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

  • 将参数按需注入到核心调用中
  • 如果核心是可实例化的,则在 __construct 中注入参数。因此,参数的选择留给框架。

可能的改进

  • 即时中间件构建,通过依赖注入到 __construct
  • 如果某个阶段的 ware 被添加,则添加异常

使用方法

查看所有层,它们设置为 echo 来宣布自身,并添加一个标题

use Psg\Psr102\{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);
/*>
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',
  ),
)
BODY

==========} 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
*/