fahrradkrucken / yaae
此包最新版本(v1.0.1)没有可用的许可信息。
另一个PHP引擎
v1.0.1
2020-04-02 13:14 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 ...