此包最新版本(v1.0.1)没有可用的许可信息。

另一个PHP引擎

v1.0.1 2020-04-02 13:14 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:24 UTC


README

此段代码是您代码库的一个简单起点。请注意,它不是一个框架,它是大约在16小时内编写的,其中大部分是在作者醉酒时完成的。好的一面是——它没有外部依赖。

应用程序生命周期

快速开始

基本上它只是一个请求-响应处理器。请参阅 demo/demo.php 中的简单示例。

操作回调

您可以使用任何 callable 参数,或者类似Laravel风格的 ControllerClass@actionMethod

请求 & 响应

好吧,请求 & 响应对象完全没有趣,而且它们也不像PSR最佳实践。但是!但是您可以根据需要操作它们,因此它们可以与您的代码更漂亮地结合。我们有3个规则

  • 请求处理器接受1个参数 RequestInterface $request 并应该返回 RequestInterface $request。如果您不返回 RequestInterface,一切都会好,所以您只需在您的“请求中间件”内部做些事情并返回空值;
  • 操作处理器接受2个参数 RequestInterface $request, ResponseInterface $response 并应该返回 ResponseInterface $response
  • 响应处理器接受1个参数 ResponseInterface $response 并应该返回 ResponseInterface $response。我们在这里有与请求处理器相同的规则。

请求处理器将从外部(全局或组)级别执行到内部(单个路由)级别。响应处理器将按相反顺序执行。

配置

主配置

您可以通过以下方式替换请求方法和路径:

  • $engine->setRequestPath(string $requestPath),默认为 $_SERVER['REQUEST_URI'],不包含末尾的 / 以及 ? 后面的参数;
  • $engine->setRequestMethod(string $requestMethod),默认为 $_SERVER['REQUEST_METHOD']

您可以替换默认类

  • FahrradKrucken\YAAE\Http\Request 通过 $engine->setRequest(RequestInterface $request)
  • FahrradKrucken\YAAE\Http\Response 通过 $engine->setResponse(ResponseInterface $response)
  • FahrradKrucken\YAAE\Core\RouteHandler 通过 $engine->setRouteHandler(RouteHandlerInterface $routeHandler)

错误

您可以替换错误处理器

  • \Throwable 错误处理器通过 $engine->setErrorHandler(callable $errorHandler)
  • \FahrradKrucken\YAAE\Http\Error 错误处理器通过 $engine->setErrorHandlerHttp(callable $errorHandler)

请注意,\FahrradKrucken\YAAE\Http\Error$request$response 属性,这可能很有用。例如,当您从 RouteHandler 获得错误404(未找到)或405(方法不允许)时,您可以通过 $errorHttp->getCode() 理解这一点。

API错误示例

<?php
use FahrradKrucken\YAAE\Engine;
use FahrradKrucken\YAAE\Http\ResponseInterface;

// ... Some Code ...

$engine->setErrorHandler(function (Throwable $error) {
    $response = new \FahrradKrucken\YAAE\Http\Response();
    $response->setStatus(ResponseInterface::STATUS_OK);
    $response->setHeader('Content-Type', 'application/json');
    $response->setData(
        json_encode(
            [
                'error_code'         => $error->getCode(),
                'error_msg' => $error->getMessage(),
            ],
            JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE
        )
    );
    Engine::sendResponse($response);
});

$engine->setErrorHandlerHttp(function (\FahrradKrucken\YAAE\Http\Error $error) {
    if (
        $error->getCode() === ResponseInterface::STATUS_NOT_FOUND ||
        $error->getCode() === ResponseInterface::STATUS_NOT_ALLOWED_METHOD
    ) { // Default Router errors
        $error->response->setHeader('Content-Type', 'application/json');
        $error->response->setData(
            json_encode(
                [
                    'error_code' => $error->response->getStatus(),
                    'error_msg'  => $error->response->getData(),
                ],
                JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE
            )
        );
        Engine::sendResponse($error->response);
    } else { // Custom errors
        if (!$error->response || !($error->response instanceof ResponseInterface)) {
            $newResponse = new \FahrradKrucken\YAAE\Http\Response();
            $newResponse->setStatus(ResponseInterface::STATUS_BAD_REQUEST);
            $newResponse->setData(json_encode(
                    [
                        'error_code' => $error->getCode(),
                        'error_msg'  => $error->getMessage(),
                    ],
                    JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE
                )
            );
        } else {
            $newResponse = $error->response;
        }
        $newResponse->setHeader('Content-Type', 'application/json');
        Engine::sendResponse($newResponse);
    }
});

// ... Some Code ...

模板化

HTML

您可以使用任何想要的模板引擎,只是别忘了将结果放在 $response->setData($templateHtmlString) 中。如果您喜欢简单的php-html模板,则可以使用默认的 FahrradKrucken\YAAE\Core\TemplateHandler。示例

<?php
/**
 * Route Handler 
 */
use FahrradKrucken\YAAE\Http\RequestInterface;
use FahrradKrucken\YAAE\Http\ResponseInterface;
use FahrradKrucken\YAAE\Core\TemplateHandler;

TemplateHandler::setTemplatePath(__DIR__);

// ... Some Code ...
function actionTemplate(RequestInterface $request, ResponseInterface $response)
    {
        $response->setData(
            TemplateHandler::render('demo-template', [
                'foo' => 12345,
                'bar' => 'Lorem ipsum dolor sit amet',
                'baz' => false,
            ])
        );
        return $response;
    }
// ... Some Code ...
<?php
/**
 * Route Template
 * 
 * @var int $foo
 * @var string $bar
 * @var bool $baz
 */
?>
<h3 style="text-align: center"><?= $foo . ' - ' . $bar ?></h3>
<p style="text-align: center"><?= $baz ? 'YES' : 'NO' ?></p>

JSON & 其他API

如果您需要以JSON格式(例如)发送响应,则可以向单个路由或路由组添加响应处理器。如下所示

<?php
use FahrradKrucken\YAAE\Core\Route;
// .. some code ...
Route::get('/some-json', function (RequestInterface $request, ResponseInterface $response) {
        $response->setData([
            'foo' => 12345,
            'bar' => 'Lorem ipsum dolor sit amet',
            'baz' => false,
        ]);
        return $response;
    })->addResponseCallback(function (ResponseInterface $response) {
        $response->setHeader('Content-Type', 'application/json');
        $response->setData(json_encode($response->getData(), JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE));
        return $response;
    });
// .. some code ...