Каталог примеров
Hello World
Минимальное приложение с поддержкой PSR-7 на Next2 выглядит так:
use PTS\Next2\Context\ContextInterface;
use PTS\Next2\MicroApp;
use PTS\Psr7\Response\JsonResponse;
use PTS\Psr7\ServerRequest;
use PTS\Psr7\Uri;
require_once '../../../vendor/autoload.php';
$psr7Request = new ServerRequest('GET', new Uri('/'));
$app = new MicroApp;
$app->store->get('/', function(ContextInterface $ctx) {
$ctx->setResponse(new JsonResponse(['message' => 'Hello World!']));
});
$psr7Response = $app->handle($psr7Request); // psr-15 runner
Композиция приложений (mount)
Приложения могут монтироваться друг в друга образуя композицию приложений. Это легко достигается 20 строчками кода (см PTS\Next\2CompositionMicroApp);
use PTS\Next2\Extra\CompositionMicroApp;
use PTS\Next2\MicroApp;
use PTS\Psr7\Response\JsonResponse;
use PTS\Psr7\ServerRequest;
use PTS\Psr7\Uri;
require_once '../../../vendor/autoload.php';
$psr7Request = new ServerRequest('GET', new Uri('/api/v1/users/'));
$app = new CompositionMicroApp;
$apiAppV1 = new MicroApp;
$apiAppV1->store->get('/users/', fn($ctx) => $ctx->response = new JsonResponse(['v1' => 'users']));
$apiAppV2 = new MicroApp;
$apiAppV2->store->get('/users/', fn($ctx) => $ctx->response = new JsonResponse(['v2' => 'users']));
$reuseApp = new MicroApp;
$reuseApp->store->get('/users/', fn($ctx) => $ctx->response = new JsonResponse(['reuse' => 'users']));
$app->mount($apiAppV1, '/api/v1')
->mount($apiAppV2, '/api/v2')
->mount($reuseApp); // merge layers without prefix to app
$psr7Response = $app->handle($psr7Request);
Такой прием позволяет логически отделять код. Производить специфическую настройку для каждого приложений отдельно, например добавить для приложения apiV1
middleware, которая будет реаоизовывать обязательную авторизацию.
Цепочка обработчикв в одном слое
Слой можно разбирть на несколько обработчиков чтобы разредить в коде на более мелкие части. Каждый обработчик это простой callable
.
use PTS\Next2\Context\ContextInterface;
use PTS\Next2\MicroApp;
use PTS\Psr7\Response\JsonResponse;
use PTS\Psr7\ServerRequest;
use PTS\Psr7\Uri;
require_once '../../../vendor/autoload.php';
$microApp = new MicroApp;
$rateLimiterHandlerForAction = function() {}; // some callable
$microApp->store->get('/users/{uid}/', [
// validateHandler
function(ContextInterface $ctx) {
$userId = (int)$ctx->getUriParams()['uid']; // 47
if ($userId < 1) {
$badResponse = new JsonResponse(['error' => 'userid is not positive number'], 400);
$ctx->setResponse($badResponse);
return;
}
$ctx->currentUserId = $userId;
$ctx->next();
},
// check rate limiter
$rateLimiterHandlerForAction,
// any callable handlers
// init/prefetch data
function(ContextInterface $ctx) {
// $ctx->currentUser = fetchUserById($ctx->currentUserId); // fetch user db or some logic
$ctx->next();
},
// action/controller
function(ContextInterface $ctx) {
$response = new JsonResponse(['hello' => $ctx->currentUser->__toString()]);
$ctx->setResponse($response);
}
]);
$psr7Request = new ServerRequest('GET', new Uri('/user/47/'));
$psr7Response = $microApp->handle($psr7Request);