andrewbreksa / unicorn
Requires
- league/container: ^2.2.0
- league/event: ^2.1.2
- league/route: ^2.0.1
- zendframework/zend-diactoros: ^1.3
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: 2.*
This package is not auto-updated.
Last update: 2022-02-01 13:03:58 UTC
README
一个小巧的单类RAD PSR-7 Web应用程序“框架”
Unicorn本质上是对zendframework/zend-diactoros的一个包装,以及几个The PHP League包:league/event、league/container和league/route,这些包提供了对整个应用生命周期的支持。
仍处于初级阶段,Unicorn源于我对想要一个框架来处理繁琐工作,但又不想强制特定的架构或风格的挫败感,因为应用程序往往非常特定于领域(应该是这样的)。
- 想构建一个闭包应用程序?简单。
- 想构建一个PSR-7中间件应用程序?使用您自己的管道实现。(我推荐league/pipeline或zend-framework/stratigility。记住,
Application
对象将自己添加到服务容器中,因此如果通过容器创建,类构造函数的依赖项会自动绑定。我本来想默认包括对中间件的支撑,但我觉得这并不是PSR-7应用程序所必需的,因此这超出了Unicorn的使命声明) - 想使用基于控制器“完整”的MVC框架?只需通过路由指定类和方法。
- 想在同一个应用程序中使用所有这些?请继续。
Unicorn旨在仅做最小的工作,提供一个服务容器、一个路由器、一些针对应用生命周期各个阶段的事件钩子以及一个PSR-7实现。如果您愿意,可以将其视为一个反框架框架。您可能需要编写一些代码... ;)
安装
composer require andrewbreksa/unicorn
使用
查看示例index.php以了解如何设置基本应用程序。(我的意思是基本)
应用程序生命周期/事件
在\Unicorn\App\Application中定义
const EVENT_BOOTSTRAP = 'app.bootstrap';
const EVENT_DISPATCH = 'app.dispatch';
const EVENT_ROUTE_EXCEPTION = 'app.route.exception';
const EVENT_DISPATCH_EXCEPTION = 'app.dispatch.exception';
const EVENT_RENDER = 'app.render';
const EVENT_EMIT_EXCEPTION = 'app.emit.exception';
const EVENT_FINISH = 'app.finish';
每个事件都在动作发生之前发出(如果有的话,Application::EVENT_RENDER
不会做任何事情),事件管理器可以通过Application::getInstance()->getEventEmitter()
访问。相当简单,请参阅league/event文档。
路由
您可以通过Application::getInstance()->getRouteCollection()
访问路由器。从那里查看league/route文档以获取更多信息。
关于在分发上调用方法/闭包等时的返回值注意事项:如果返回 NULL
(或什么也没有,隐含)则不更新 Application->$response
,但执行发射过程。然而,如果你返回 FALSE
,则不执行发射过程,并且也不会发射 Application::EVENT_RENDER
(不用说,Application::EVENT_EMIT_EXCEPTION
)。这可以用于在特定路由上运行其他“非Unicorn”代码或框架。
PSR-7
真的吗?好吧,查看 php-fig.org 了解更多信息。
配置
配置存储在 ./config/autoload
中。这里的任何 *.php
或 *.json
文件都将被 include
或解析并添加到 Application::getInstance()->getConfig()
。而且,一如既往,你可以完全忽略这种约定,做任何你想做的事情。
无论配置如何设置,在 Application->bootstrap()
(在 EVENT_BOOTSTRAP
之后),如果在 Application->getConfig()
中有任何 services
、routes
或 eventListeners
,则这些键的值分别传递给 Application->bootstrapServices()
、Application->bootstrapRoutes()
和 Application->bootstrapEventListeners()
。
依赖容器
Unicorn 使用 league/container,它遵循 container-interop 标准。所有 Application::getInstance()->get*()
对象也通过容器(Application::getInstance()->getContainer()
)可用,因为Unicorn将自己注册为代理(除了容器本身、baseDir
和 data
。依赖容器还设置为使用 League\Container\ReflectionContainer
作为代理,因此如果可用,构造函数依赖将自动设置 更多关于自动连接。
注意事项
由于Unicorn的架构和使用案例仍在完善中,我还没有编写完整的文档。这更像是一个宠物项目,我正在用几个个人项目进行RAD(快速应用开发)。
附加到各种 Application::EVENT_*
事件的监听器默认传递 \League\Event\Event
和应用程序实例。EVENT_*_EXCEPTION
事件还传递一个额外的 \Exception
参数。
结论
Unicorn本应做几乎所有事情,简而言之,任何PHP Web应用程序都需要的一切。如果你厌倦了将域需求适应框架或需要编写黑客式的解决方案来处理由于缺乏控制而引起的问题,你可能会喜欢与Unicorn一起工作。
请随意分支并对该存储库提出拉取请求。我并不声称自己知道我在做什么,我认为Unicorn最好作为由共同项目需求定义的项目来发展社区,而不是由一组特定的设计模式和“全功能”心态来定义。