alexpts/php-simple-middlewares

Simple middlewares manager compatible with the PSR-7

1.1.0 2017-06-12 09:05 UTC

This package is auto-updated.

Last update: 2024-11-15 02:39:17 UTC


README

SensioLabsInsight

Build Status Test Coverage Code Climate Scrutinizer Code Quality

New PSR-15 compatible middleware manager

(deprecated) Simple middlewares compatible with the PSR-7

MiddlewaresManager позволяет настраивать очередь выполнения программного обеспечения промежуточного уровня. Каждый middleware принимает на вход объект запроса $request, при желании может что-то сделать с ним или создать новый объект $request и передать его в следующий middleware, ожидая от него объект response. Затем он может что-то сделать с объектом response или просто передать его пердыдущему middleware.

Milddleware, может не вызывать следующий middleware, а вернуть результат в ранее вызванный middleware. Т.е. каждый middleware получает управление 2 раза. В момент прохода объекта $request и в момент возврата $response обратно

Для обеспечения гибкости и встраивомости компонента, middleware обработчкичи не ограничены никаким интерфейсом. Обработчиком может быть любой callable тип, которому будет передано 2 параметра ServerRequestInterface $request, callable $next. Для более формальной разработки каждый обработчик может поддерживать формальный интерфейс MiddlewareInterface.

Возвращаемый тип объекта $response также никак не ограничен. Вы можете вернуть из обработчика любой тип, например массив или объект типа ResponseInterface (psr-7). Формально ограничить на свой выбор вы можете указав тип возвращаемого значения в php 7.

Installation

$ composer require alexpts/php-simple-middlewares

Примеры

Произвольный обработчик

use Psr\Http\Message\ServerRequestInterface;
use PTS\Middleware\MiddlewareManager;

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(function($request, $next){
    /* optionally modify the request */
    $request = $request->...;
	
    /* optionally skip the $next middleware and return early */
    if (...) {
        return $response;
    }
	
    /* optionally invoke the $next middleware and get back a new response */
    $response = $next($request);
	
    /* optionally modify the Response if desired */
    $response = $response->...;
	
    return $response;
});

Несолько MiddlewareInterface обработчиков

use Psr\Http\Message\ServerRequestInterface;
use PTS\Middleware\MiddlewareManager;
use PTS\Middleware\MiddlewareInterface;

class MiddlewareA implements MiddlewareInterface
{
    public function __invoke(ServerRequestInterface $request, callable $next)
    {
        $method = $request->getMethod();
        if (method !== 'GET') {
            return new JsonResponse(['status' => 405], 405);
        }

        $response = $next($request);
        /* optionally modify the Response if desired */
        $response = $response->...;

        return $response;
    }
}

class FrontController implements MiddlewareInterface
{
    public function __invoke(ServerRequestInterface $request, callable $next)
    {
        /* ... some work and create response */	
        return $response;
    }
}

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(new MiddlewareA);
$middlewareManager->push(new FrontController);

/* ... PSR-7 $request */
$response = $middlewareManager($request);

Обработчики ошибок/исключений

Если рассматривать middleware как независимые приложения, то каждый обработчик должен вернуть PSR-7 ответ в случае ошибки/исключения. Такой ответ должен пройти всю цепочку middleware в обратном порядке.

$middlewareManager = new MiddlewareManager();
$middlewareManager->push(new MiddlewareA);
$middlewareManager->push(new FrontController, function (\Throwable $ex) {
    return new JsonResponse(['error' => $ex->getMessage()], 500);
});

$response = $middlewareManager($request);