linkeddatacenter / usilex
基于 SILEX 子集的超轻量级框架。非常适合微服务和 JAMstack。
Requires
- php: ^7.1.3
- pimple/pimple: ^3.2
- psr/container: ^1.0
- psr/http-message: ~1.0
- psr/http-server-handler: ~1.0
- psr/http-server-middleware: ~1.0
Requires (Dev)
- aura/router: ^3.0
- friendsofphp/php-cs-fixer: ^2.1
- guzzlehttp/psr7: ^1.4
- middlewares/aura-router: ^1.1
- middlewares/error-handler: ^1.2
- middlewares/request-handler: ^1.3
- middlewares/utils: ^2.1
- phpunit/phpunit: ^7
- relay/relay: 2.x@dev
- squizlabs/php_codesniffer: ^3.3
- zendframework/zend-diactoros: ~1.8
- zendframework/zend-httphandlerrunner: ^1.0
- zendframework/zend-stratigility: ^3.0
This package is auto-updated.
Last update: 2024-01-19 20:27:17 UTC
README
µSilex
µSilex(又称微 Silex)是一个受 Pimple 和 PSR 标准启发的微框架。所有代码行数不到 100 行!
本项目旨在构建一个标准的中间件框架,用于开发需要最大性能和最小内存占用的大型微服务和 API 端点。
为什么选择 Pimple?因为它懒惰、一致、快速、优雅且小巧(大约 80 行代码)。还有什么吗?
为什么选择 PSR 标准?因为它是一个成功的社区项目,有大量的良好实现(psr15-middlewares、Zend stratigility、Guzzle 等)。
为什么选择 µSilex?Silex 是一个很棒的框架,但现在已被遗弃,转而使用 Symfony + Flex。当你需要更多功能和灵活性时,这是很好的。但你要付出复杂性和内存占用的代价。µSilex 是一个新的项目,它覆盖了原始 Silex 项目的很小一部分:µSilex 应用程序只是一个实现 PSR-15 规范的 Pimple 容器。仅此而已。
事实上,在 JAMStack、Docker 和 XaaS 时代,你可以将许多传统框架的功能留给系统应用程序架构中的其他组件(例如缓存、认证、安全、监控、渲染等)。
µSilex 是否是 Silex 的替代品?不,但它可以用来构建你自己的“类似 Silex”的框架。
当然有 µSilex 的替代品。例如,Zend 框架的 Zend Expressive 组件具有类似的原则。但它不是“容器导向”的,并且绑定到 Zend 库。除了路由外,Zend Expressive 还实现了“管道”作为向应用程序添加中间件的一种机制。
µSilex 基于以下几个原则
- 保持简单:这样你可以理解所有的代码;
- 保持小巧:这样你可以控制你的项目;
- 保持快速:好吧,让它更快...
- 使用 PSR 标准:不要重复造轮子;
- 采用中间件架构;
- “一劳永逸”是不存在的!而且 µSilex 也不例外。选择适合你问题的正确框架。
祝您有个愉快的一天!
安装
composer require linkeddatacenter/usilex
概述
基本上,µSilex 提供了一个名为 Application 的类,它是一个 Pimple 容器,实现了 PSR-15 中间件接口和 PSR-11 容器接口。
中间件现在在开发者社区中非常受欢迎,其背后的理念是“包装”你的应用程序逻辑,并添加额外的请求处理逻辑,然后根据喜好链式连接这些包装器。因此,当服务器接收到请求时,它首先由中间件处理,然后在你生成响应后,它也会被相同的集合处理(图片来自 Zend Expressive)。
请注意,在这个模型中,传统的通过控制器路由只是中间件管道中的一个可选步骤。
中间件是实现PSR-15中间件接口的软件组件
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\MiddlewareInterface; class MyMiddleware implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { //here your code that returns a response or passes the control to the handler } }
µSilex不绑定任何特定实现(除了Pimple)或任何中间件实现。
相反,µSilex实现了一个框架来使用现有的标准实现。µSilex采用PSR-7规范用于HTTP消息,PSR-15用于管理HTTP句柄和中间件,PSR-11用于容器。
用法
要将µSilex与特定的接口规范绑定,你需要在容器中配置一些条目
- uSilex.request:一个服务,用于实例化PSR-7服务器请求对象的实现
- uSilex.responseEmitter:一个可选的可调用函数,用于回显HTTP。如果未提供,则不生成任何输出。
- uSilex.exceptionHandler:一个可调用函数,用于从PHP异常生成HTTP响应。如果未提供,则仅输出带有文本体的HTTP 500响应头
- uSilex.httpHandler:一个服务,用于实例化PSR-15 HTTP句柄的实现
µSilex应用程序公开了run方法,该方法实现了典型的服务器处理工作流程
- 使用uSilex.request服务创建请求
- 调用uSilex.httpHandler
- 通过调用uSilex.responseEmitter来发出HTTP响应
如果在过程中抛出PHP异常,它们将由uSilex.exceptionHandler转换为响应,然后由uSilex.responseEmitter发出。
uSilex.responseEmitter的签名是function ($response) { echo ....}
。uSilex.exceptionHandler的签名是function ($exception, $request) {}
。
有许多库实现了与µSilex完全兼容的优秀的可重用中间件和HTTP句柄。例如,请参阅MW库。µSilex也与许多Silex Service Providers以及一些Silex Application traits兼容。
你可以通过选择适合你需求的组件来创建自己的框架。此片段使用Relay库作为PSR-15 http句柄,并使用Diactoros作为PSR-7 http消息。
require_once __DIR__.'/../vendor/autoload.php'; include "MyMiddleware.php"; // here your MyMiddleware class definition $app = new \uSilex\Application; $app['uSilex.request'] = \Zend\Diactoros\ServerRequestFactory::fromGlobals(); $app['uSilex.responseEmitter'] = $app->protect(function($response) {echo $response->getBody(); }); $app['uSilex.httpHandler'] = function($app) { return new \Relay\Relay([new MyMiddleware($app)]); }; $app->run();
µSilex服务提供商
µSilex默认提供了一组Service Providers,你可以将其作为实现自己的模型的示例。
Provider\Psr7\DiactorosServiceProvider
将µSilex应用程序绑定到Zend Diactoros对PSR7规范的实现。
Provider\Psr7\GuzzleServiceProvider
将µSilex应用程序绑定到Guzzle对PSR7规范的实现。
Provider\Psr15\RelayServiceProvider
将µSilex应用程序绑定到Relay,这是PSR-15规范的一个快速、无附加功能的实现。
Provider\Psr15\ZendPipeServiceProvider
将µSilex应用程序绑定到MiddlewarePipe部分,这是来自zend-stratigility库的Psr15实现。
配置新的服务提供者
µSilex服务提供者是普通的Pimple服务提供者,可选地定义了boot方法。此方法将被应用程序的boot方法调用一次。仅在绝对必要时使用此功能。启动方法将由应用程序的运行方法自动调用。
编写PSR-15服务提供者的最佳实践是允许用户将中间件声明为Pimple服务,并允许用户使用handler.queue数组定义中间件队列(即管道)。handler.queue元素也可以是一个实现迭代接口的服务。例如
... $app= new Application; $app->register( new MyPsr7ServiceProvider() }; $app['my.router'] = function($app) { return new \My\RouterMiddleWare($app) }; $app['my.notfound'] = function($app) { return new \My\NotFoundMiddleWare($app) }; $app['handler.queue'] = [ 'my.router' 'my.notfound' ]; $app['uSilex.httpHandler'] = function($app) { return new MyHttpHandler($app['handler.queue']); }; $app->boot()->run();
其他工具
µSilex还提供了两个现成的反模式特性:\uSilex\Psr11Trait实现了PSR-11接口,\uSilex\ContainerAwareTrait将PSR-11容器(例如µSilex应用程序)附加到任何对象。
完整示例
<?php require_once __DIR__.'/../vendor/autoload.php'; use uSilex\Application; use uSilex\ContainerAwareTrait; use uSilex\Provider\Psr15\RelayServiceProvider as Psr15Provider; use uSilex\Provider\Psr7\DiactorosServiceProvider as Psr7Provider ; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\MiddlewareInterface; use Zend\Diactoros\Response\TextResponse; class MyMiddleware implements MiddlewareInterface { use ContainerAwareTrait; public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { return new \Zend\Diactoros\Response\TextResponse( $this->containerGet('message', 'Hi')); } } $app = new Application; $app->register(new Psr15Provider()); $app->register(new Psr7Provider()); $app['myMiddleware'] = function($app) { return new MyMiddleware($app); }; $app['message'] = 'hello world!'; $app['handler.queue'] = ['myMiddleware']; $app->run();
在HTML目录中查看更多示例。
开发者快速入门
安装docker并运行
docker run --rm -ti -p 8000:8000 -v $PWD/.:/app composer bash
composer cs-fix
composer test
composer coverage
composer examples
# Until ctr-c is pressed, point your browser to https://:8000/examples/
exit
有关贡献详细信息,请参阅CONTRIBUTING。
致谢
µSilex受到了以下项目的启发