此包已被弃用,不再维护。没有建议的替代包。

基于 SILEX 子集的超轻量级框架。非常适合微服务和 JAMstack。

1.2.0 2018-10-14 15:33 UTC

This package is auto-updated.

Last update: 2024-01-19 20:27:17 UTC


README

µSilex logo

µSilex

Latest Version on Packagist Software License Scrutinizer Code Quality Code Coverage Build Status

µ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)。

architecture

请注意,在这个模型中,传统的通过控制器路由只是中间件管道中的一个可选步骤。

中间件是实现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受到了以下项目的启发