psg/psr-102

应用程序标准化

0.1 2021-07-11 23:19 UTC

This package is auto-updated.

Last update: 2024-09-15 06:15:21 UTC


README

此标准已被https://github.com/PHP-SG/sr-2 替换。

PSR 102 应用程序标准化

PSR 101 中间件应用程序无法解决一些问题

  • 一些“中间件”既不关心前端也不关心后端,也不应该通过调用 handlenext 来强制其关心
  • 一些应用程序需要外部逻辑 - 在响应发送后或非常开始时运行的逻辑,并且不关心改变请求和响应

这导致了 LayeredAppInterface。

概念

类型

  • Beforeware:用于设置配置的外部逻辑
  • Frontware:只关心前端的中间件
  • Middleware:封装核心和其他中间件的常规中间件
  • Coreware:被中间件封装的核心应用程序逻辑
  • Backware:只关心后端的中间件
  • Afterware:用于在响应后进行操作的外部逻辑,如清理

Layered App

ExitResponseInterface 前端中间件为了强制绕过,因为它不通过调用 next 来控制流程,必须返回一个实现 ExitResponseInterface 的特殊响应。它通过应用程序工厂 $app->createExitResponse 完成,这与 createResponse 相似。

请求和响应流程

上面的图是过度简化了。现实看起来更像是这样:Layered App

在这里,您可以看到响应被从前端中间件转发到核心。

Coreware

在应用程序中,有一个核心的概念,通常被称为控制器。这个核心的特殊之处在于,无论在应用程序运行过程中添加了什么中间件,核心始终在核心(而中间件的执行取决于其他中间件的列表)处执行。我决定将这个 core 称为而不是 control 以使其更通用(它还包括运行视图代码)。我还决定将其作为一个单例可调用或具有 __invoke 方法的可实例化事物。在我的实现中,我向可调用提供参数($request, $response, $app)。然而,框架可能希望将参数注入核心调用中

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

中间件,如路由器,可以使用 $app->core($core) 设置核心。 $app->core() 方法设置此核心ware,并将覆盖先前的任何核心。我决定核心ware不应是多个。核心ware 不期望是通用的,它期望是特定于应用程序的,因此列表是不必要的。

关于 has 函数有一个概念上的问题。由于现在有了外部逻辑,并且有前端和后端特定的中间件,has 指的是什么?

扩展

我想框架将想要扩展 LayeredApp 以使用 FIG PSR-11 和 FIG PSR-14。我可能稍后会添加这样的接口到这个存储库。

示例

请参阅 psr-102-implementation