Каталог примеров


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\2CompositionMicroAppopen in new window);

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);