elephox/miniphox-framework

基于Elephox的最小化API框架。

v0.8.8 2023-11-01 00:59 UTC

README

TL;DR

composer create-project elephox/miniphox my-api && \
cd my-api && \
composer run serve

然后

curl http://localhost:8008/api/greet/$(whoami)

完成。

尽可能快速地解释Miniphox

  • React HTTP服务器后端(多线程PHP套接字服务器)
  • Elephox/DI依赖注入
  • 使用PHP属性的可访问路由器
  • 非常适合(小型)API项目
  • 以最小的努力快速投入生产

给我看看一些代码

hello-world.php

<?php
declare(strict_types=1);

// this is the default namespace; can be specified in build()
namespace App;

require_once dirname(__DIR__) . '/vendor/autoload.php';

use Elephox\Miniphox\Attributes\Get;
use Elephox\Miniphox\MiniphoxBase;

#[Get] // defaults to '/'
function index(): string {
    return "Hello, World!";
}

#[Get('/greet/[name]')] // using route params
function greet(string $name): string {
    return "Hello, $name!";
}

// This creates a new Miniphox app.
MiniphoxBase::build()

    // index() and greet() are mounted at '/api'.
    // This maps '/api' -> index() and '/api/greet/[name]' -> greet() according to their attributes above.
    //
    // You can pass first-class-callables or just the method name to the mount method.
    ->mount('/api', index(...), 'greet')

    // This will start the HTTP server on http://0.0.0.0:8008.
    // Pass a string uri to bind to a specific ip address or a different port.
    ->run();

上面的示例是使用Miniphox的最简单方式。只是直接的路由处理程序,几乎没有逻辑,一行代码就能运行一切。

更复杂的示例可能会使用依赖注入将数据库连接或记录器注入到路由处理程序中

counter.php

<?php // [...]

#[Get('/count')]
function counter(stdClass $counter): string {
    // $counter will get injected from the service specified below

    return "The current count is $counter->i";
}

$app = Miniphox::build()->mount('/api', counter(...));

// transient services get created every time they are requested (unlike singletons)
$app->services->addTransient(stdClass::class, stdClass::class, function () {
    static $i; // this keeps track of how many times this services was created

    $counter = new stdClass();
    $counter->i = ++$i;

    return $counter;
});

$app->run();

您可以在example文件夹中找到这两个示例。此外,还有一个包含一些高级示例的showcase.php文件。

丑陋的部分

该项目仍处于婴儿状态,并且可能保持这种状态。还有一些事情要做,即提高路由器的能力,我不确定我将来会投入多少时间和精力。毕竟,这是一个玩具项目。

一些待办事项包括

  • 检查是否存在多个动态路由,并确定最佳匹配
  • 在路由参数中使用正则表达式模式
  • 检查如何进一步提高性能(是否可以利用opcache?)
  • 编写一些教程,说明如何设置Doctrine和其他常用软件堆栈(使用Elephox/Configuration的phpdotenv?)
  • 改进服务器时间记录的方式(也许还可以了解一下在处理请求时如何使用ReactPHP发送头信息)
  • 添加文件监视和自动重新启动服务器
  • 可能:重构Miniphox以成为服务器无关的(用OpenSwoole、Amphp等服务器替换ReactPHP)