PHP code example of oscarotero / psr7-middlewares

1. Go to this page and download the library: Download oscarotero/psr7-middlewares library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

oscarotero / psr7-middlewares example snippets


use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

function (RequestInterface $request, ResponseInterface $response, callable $next) {
    // ...
}

use Psr7Middlewares\Middleware;

use Relay\RelayBuilder;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequestFactory;
use Zend\Diactoros\Stream;

//Set a stream factory used by some middlewares
//(Required only if Zend\Diactoros\Stream is not detected)
Middleware::setStreamFactory(function ($file, $mode) {
    return new Stream($file, $mode);
});

//Create a relay dispatcher and add some middlewares:
$relay = new RelayBuilder();

$dispatcher = $relay->newInstance([

    //Calculate the response time
    Middleware::responseTime(),

    //Add an Uuid to request
    Middleware::uuid(),

    //Minify the result
    Middleware::minify(),

    //Handle errors
    Middleware::errorHandler()->catchExceptions(true),

    //Override the method using X-Http-Method-Override header
    Middleware::methodOverride(),

    //Parse the request payload
    Middleware::payload(),

    //Remove the path prefix
    Middleware::basePath('/my-site/web'),

    //Remove the trailing slash
    Middleware::trailingSlash(),

    //Digest authentication
    Middleware::digestAuthentication(['username' => 'password']),

    //Get the client ip
    Middleware::clientIp(),

    //Allow only some ips
    Middleware::firewall(['127.0.0.*']),

    //Detects the user preferred language
    Middleware::languageNegotiator(['gl', 'es', 'en']),

    //Detects the format
    Middleware::formatNegotiator(),

    //Adds the php debug bar
    Middleware::debugBar(),

    //Execute fast route
    Middleware::fastRoute($app->get('dispatcher')),
]);

$response = $dispatcher(ServerRequestFactory::fromGlobals(), new Response());

use Psr7Middlewares\Middleware;
use Monolog\Logger;
use Monolog\Handler\ErrorLogHandler;

//Create the logger
$logger = new Logger('access');
$logger->pushHandler(new ErrorLogHandler());

$middlewares = [

    //Required to get the Ip
    Middleware::ClientIp(),

    Middleware::AccessLog($logger) //Instance of Psr\Log\LoggerInterface
        ->combined(true)           //(optional) To use the Combined Log Format instead the Common Log Format
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //Example with authentication
    Middleware::BasicAuthentication([
        'username1' => 'password1',
        'username2' => 'password2'
    ]),

    //Map the key used by this middleware
    Middleware::attributeMapper([
        Middleware\BasicAuthentication::KEY => 'auth:username'
    ]),

    function ($request, $response, $next) {
        //We can get the username as usual
        $username = BasicAuthentication::getUsername($request);

        //But also using the "auth:username" attribute name.
        assert($username === $request->getAttribute('auth:username'));

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\AuraRouter;
use Aura\Router\RouterContainer;

//Create the router
$router = new RouterContainer();

$map = $router->getMap();

$map->get('hello', '/hello/{name}', function ($request, $response, $myApp) {

    //The route parameters are stored as attributes
    $name = $request->getAttribute('name');

    //You can get also the route instance
    $route = AuraRouter::getRoute($request);

    //Write directly in the response's body
    $response->getBody()->write('Hello '.$name);

    //or echo the output (it will be captured and writted into body)
    echo 'Hello world';

    //or return a string
    return 'Hello world';

    //or return a new response
    return $response->withStatus(200);
});

//Add to the dispatcher
$middlewares = [

    Middleware::AuraRouter($router) //Instance of Aura\Router\RouterContainer
        ->arguments($myApp)         //(optional) append more arguments to the controller
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\AuraSession;

$middlewares = [

    Middleware::AuraSession(),
        ->factory($sessionFactory) //(optional) Intance of Aura\Session\SessionFactory
        ->name('my-session-name'), //(optional) custom session name

    function ($request, $response, $next) {
        //Get the session instance
        $session = AuraSession::getSession($request);

        return $response;
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\BasePath;

$middlewares = [

    Middleware::BasePath('/web/public') // (optional) The path to remove...
        ->autodetect(true),             // (optional) ...or/and autodetect the base path

    function ($request, $response, $next) {
        //Get the removed prefix
        $basePath = BasePath::getBasePath($request);

        //Get a callable to generate full paths
        $generator = BasePath::getGenerator($request);

        $generator('/other/path'); // /web/public/other/path

        return $response;
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::BasicAuthentication([
            'username1' => 'password1',
            'username2' => 'password2'
        ])
        ->realm('My realm'), //(optional) change the realm value

    function ($request, $response, $next) {
        $username = BasicAuthentication::getUsername($request);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::BlockSpam('spammers.txt'), //(optional) to set a custom spammers list instead the piwik's list
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Cache(new Psr6CachePool()) //the PSR-6 cache implementation
        ->cacheControl('max-age=3600'),    //(optional) to add this Cache-Control header to all responses
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\ClientIp;

$middlewares = [

    Middleware::ClientIp()
        ->remote()  // (optional) Hack to get the ip from localhost environment
        ->headers([ // (optional) to change the trusted headers
            'Client-Ip',
            'X-Forwarded-For',
            'X-Forwarded'
        ]),

    function ($request, $response, $next) {
        //Get the user ip
        $ip = ClientIp::getIp($request);

        //Get all ips found in the headers
        $all_ips = ClientIp::getIps($request);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Cors($settings)                 //(optional) instance of Neomerx\Cors\Contracts\Strategies\SettingsStrategyInterface
        ->origin('http://example.com:123')      //(optional) the server origin
        ->allowedOrigins([                      //(optional) Allowed origins
            'http://good.example.com:321' => true,
            'http://evil.example.com:123' => null,
        ])
        ->allowedMethods([                      //(optional) Allowed methods. The second argument forces to add the allowed methods to preflight response
            'GET' => true,
            'PATCH' => null,
            'POST' => true,
            'PUT' => null,
            'DELETE' => true,
        ], true)
        ->allowedHeaders([                      //(optional) Allowed headers. The second argument forces to add the allowed headers to preflight response
            'content-type' => true,
            'some-disabled-header' => null,
            'x-enabled-custom-header' => true,
        ], true)
        ->exposedHeaders([                      //(optional) Headers other than the simple ones that might be exposed to user agent
            'Content-Type' => true,
            'X-Custom-Header' => true,
            'X-Disabled-Header' => null,
        ])
        ->allowCredentials()                    //(optional) If access with credentials is supported by the resource.
        ->maxAge(0)                             //(optional) Set pre-flight cache max period in seconds.
        ->checkHost(true)                       //(optional) If request 'Host' header should be checked against server's origin.
];


$middlewares = [

    Middleware::csp($directives)                          //(optional) the array with the directives.
        ->addSource('img-src', 'https://ytimg.com')       //(optional) to add extra sources to whitelist
        ->addDirective('upgrade-insecure-requests', true) //(optional) to add new directives (if it doesn't already exist)
        ->supportOldBrowsers(false)                       //(optional) support old browsers (e.g. safari). True by default
];


$middlewares = [

    //ion(),
    //or
    Middleware::PhpSession(),

    //ddleware::ClientIp(),

    Middleware::Csrf()
        ->autoInsert(), //(optional) To insert automatically the tokens in all POST forms

    function ($request, $response, $next) {
        //Get a callable to generate tokens (only if autoInsert() is disabled)
        $generator = Middleware\Csrf::getGenerator($request);

        //Use the generator (you must pass the action url)
        $response->getBody()->write(
            '<form action="/action.php" method="POST">'.
            $generator('/action.php').
            '<input type="submit">'.
            '</form>'
        );

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use DebugBar\StandardDebugBar;

$debugBar = new StandardDebugBar();

$middlewares = [

    Middleware::FormatNegotiator(), //(recomended) to insert only in html responses

    Middleware::DebugBar($debugBar) //(optional) Instance of debugbar
        ->captureAjax(true)         //(optional) To send data in headers in ajax
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::delay(3.5),      //delay the response 3.5 seconds

    Middleware::delay([1, 2.5]), //delay the response between 1 and 1.5 seconds
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\DetectDevice;

$middlewares = [

    Middleware::DetectDevice(),

    function ($request, $response, $next) {
        //Get the device info
        $device = DetectDevice::getDevice($request);

        if ($device->isMobile()) {
            //mobile stuff
        }
        elseif ($device->isTablet()) {
            //tablet stuff
        }
        elseif ($device->is('bot')) {
            //bot stuff
        }

        return $next($request, $response);
    },
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::DigestAuthentication([
            'username1' => 'password1',
            'username2' => 'password2'
        ])
        ->realm('My realm') //(optional) custom realm value
        ->nonce(uniqid()),   //(optional) custom nonce value

    function ($request, $response, $next) {
        $username = DigestAuthentication::getUsername($request);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\EncodingNegotiator;

$middlewares = [

    Middleware::EncodingNegotiator()
        ->encodings(['gzip', 'deflate']), //(optional) configure the supported encoding types

    function ($request, $response, $next) {
        //get the encoding (for example: gzip)
        $encoding = EncodingNegotiator::getEncoding($request);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\ErrorHandler;

function handler($request, $response, $myApp) {
    switch ($response->getStatusCode()) {
        case 404:
            return 'Page not found';

        case 500:
            //you can get the exception catched
            $exception = ErrorHandler::getException($request);

            return 'Server error: '.$exception->getMessage();

        default:
            return 'There was an error'
    }
}

$middlewares = [

    Middleware::ErrorHandler('handler') //(optional) The error handler
        ->arguments($myApp)             //(optional) extra arguments to the handler
        ->catchExceptions()             //(optional) to catch exceptions
        ->statusCode(function ($code) { //(optional) configure which status codes you want to handle with the errorHandler
            return $code >= 400 && $code < 600 && $code != 422; // you can bypass some status codes in case you want to handle it
        })
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::formatNegotiator(), //(recomended) to detect the content-type header

    Middleware::expires()
        ->addExpire('text/css', '+1 week') //Add or edit the expire of some types
];

use Psr7Middlewares\Middleware;

$router = FastRoute\simpleDispatcher(function (FastRoute\RouteCollector $r) {

    $r->addRoute('GET', '/blog/{id:[0-9]+}', function ($request, $response, $app) {
        return 'This is the post number'.$request->getAttribute('id');
    });
});

$middlewares = [

    Middleware::FastRoute($router) //Instance of FastRoute\Dispatcher
        ->argument($myApp)         //(optional) arguments appended to the controller
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //Middleware::Firewall()
        ->trusted(['123.0.0.*'])   //(optional) ips allowed
        ->untrusted(['123.0.0.1']) //(optional) ips not allowed
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\FormatNegotiator;

$middlewares = [

    Middleware::FormatNegotiator()
        ->defaultFormat('html') //(optional) default format if it's unable to detect. (by default is "html")
        ->addFormat('tiff', ['image/tiff', 'image/x-tiff']), //(optional) add a new format associated with mimetypes

    function ($request, $response, $next) {
        //get the format (for example: html)
        $format = FormatNegotiator::getFormat($request);

        return $next($request, $response);
    }
];

//This will only negotiate html, pdf and xml. html is the default.
Middleware::FormatNegotiator([
    'html' => [['html', 'htm', 'php'], ['text/html', 'application/xhtml+xml']],
    'pdf' => [['pdf'], ['application/pdf', 'application/x-download']],
    'xml' => [['xml'], ['text/xml', 'application/xml', 'application/x-xml']]
])

//This will generate a 406 Not Acceptable response if the client requests anything other than html.
Middleware::FormatNegotiator([
        'html' => [['html', 'htm', 'php'], ['text/html', 'application/xhtml+xml']]
    ])
    ->defaultFormat(null)

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect html responses
    Middleware::FormatNegotiator(),

    Middleware::FormTimestamp()
        ->key('my-secret-key'),   //Key used to encrypt/decrypt the input value.
        ->min(5)                  //(optional) Minimum seconds needed to validate the request (default: 3)
        ->max(3600)               //(optional) Life of the form in second. Default is 0 (no limit)
        ->inputName('time-token') //(optional) Name of the input (default: hpt_time)
        ->autoInsert(),           //(optional) To insert automatically the inputs in all POST forms

    function ($request, $response, $next) {
        //Get a callable to generate the inputs (only if autoInsert() is disabled)
        $generator = Middleware\FormTimestamp::getGenerator($request);

        //Use the generator (you must pass the action url)
        $response->getBody()->write(
            '<form action="/action.php" method="POST">'.
            $generator().
            '<input type="submit">'.
            '</form>'
        );

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\Geolocate;

$middlewares = [

    //(optional) only if you want to save the result in the user session
    Middleware::PhpSession(),
    //or
    Middleware::AuraSession(),


    //eware before)

    function ($request, $response, $next) {
        //get the location
        $addresses = Geolocate::getLocation($request);

        //get the country
        $country = $addresses->first()->getCountry();

        $response->getBody()->write('Hello to '.$country);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect html responses
    Middleware::formatNegotiator(),

    Middleware::GoogleAnalytics('UA-XXXXX-X') //The site id
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //zip()
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect html responses
    Middleware::formatNegotiator(),

    Middleware::Honeypot()
        ->inputName('my_name') //(optional) The name of the input field (by default "hpt_name")
        ->inputClass('hidden') //(optional) The class of the input field (by default "hpt_input")
        ->autoInsert(),        //(optional) To insert automatically the inputs in all POST forms

    function ($request, $response, $next) {
        //Get a callable to generate the inputs (only if autoInsert() is disabled)
        $generator = Middleware\Honeypot::getGenerator($request);

        //Use the generator (you must pass the action url)
        $response->getBody()->write(
            '<form action="/action.php" method="POST">'.
            $generator().
            '<input type="submit">'.
            '</form>'
        );

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Https(true)   //(optional) True to force https, false to force http (true by default)
        ->maxAge(1000000)     //(optional) max-age directive for the Strict-Transport-Security header. By default is 31536000 (1 year)
        ->

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect responses' mimetype
    Middleware::formatNegotiator(),

    Middleware::imageTransformer([   // The available sizes of the images.
            'small.' => 'resizeCrop,50,50', //Creates a 50x50 thumb of any image prefixed with "small." (example: /images/small.avatar.jpg)
            'medium.' => 'resize,500|format,jpg', //Resize the image to 500px and convert to jpg
            'pictures/large.' => 'resize,1000|format,jpg', //Transform only images inside "pictures" directory (example: /images/pcitures/large.avatar.jpg)
        ])
        ->clientHints()              // (optional) To enable the client hints headers
        ->cache(new Psr6CachePool()) // (optional) To save the transformed images in the cache

    function ($request, $response, $next) {
        //Get the generator to generate urls
        $generator = Middleware\ImageTransformer::getGenerator($request);

        //Use the generator
        $response->getBody()->write('<img src="'.$generator('images/picture.jpg', 'small.').'">');

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [
    Middleware::ntinue with the next middleware on error or not
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\JsonValidator;

// Validate using a file:
$middlewares = [
    Middleware::payload(['forceArray' => false]),
    JsonValidator::fromFile(new \SplFileObject(WEB_ROOT . '/json-schema/en.v1.users.json')),
];

// Validate using an array:
$middlewares = [
    Middleware::payload(['forceArray' => false]),
    JsonValidator::fromArray([
        '$schema' => 'http://json-schema.org/draft-04/schema#',
        'type' => 'object',
        'properties' => [
            'id' => [
                'type' => 'string'
            ],
        ],
        '

use Psr7Middlewares\Middleware;

$middlewares = [

    // Transform `application/json` into an object, which is a schema files.
    Middleware::jsonSchema([
        '/en/v1/users' => WEB_ROOT . '/json-schema/en.v1.users.json',
        '/en/v1/posts' => WEB_ROOT . '/json-schema/en.v1.posts.json',
        '/en/v2/posts' => WEB_ROOT . '/json-schema/en.v2.posts.json',
    ])
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\LanguageNegotiator;

$middlewares = [

    Middleware::LanguageNegotiator(['gl', 'en']) //Available languages
        ->usePath(true)                          //(optional) To search the language in the path: /gl/, /en/
        ->redirect()                             //(optional) To return a redirection if the language is not in the path

    function ($request, $response, $next) {
        //Get the preferred language
        $language = LanguageNegotiator::getLanguage($request);

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use League\Route\RouteCollection;

$router = new RouteCollection();

$router->get('/blog/{id:[0-9]+}', function ($request, $response, $vars) {
    return 'This is the post number'.$vars['id'];
});

$middlewares = [

    Middleware::LeagueRoute($router) //The RouteCollection instance
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::MethodOverride()
        ->get(['HEAD', 'CONNECT', 'TRACE', 'OPTIONS']), //(optional) to customize the allowed GET overrided methods
        ->post(['PATCH', 'PUT', 'DELETE', 'COPY', 'LOCK', 'UNLOCK']), //(optional) to customize the allowed POST overrided methods
        ->parameter('method-override') //(optional) to use a parsed body and uri query parameter in addition to the header
        ->parameter('method-override', false) //(optional) to use only the parsed body (but not the uri query)
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect the mimetype of the response
    Middleware::formatNegotiator(),

    Middleware::Minify()
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Payload([     // (optional) Array of parsing options:
        'forceArray' => false // Force to use arrays instead objects in json (true by default)
    ])
    ->override(),             // (optional) To override the existing parsed body if exists (false by default)

    function ($request, $response, $next) {
        //Get the parsed body
        $content = $request->getParsedBody();

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::PhpSession()
        ->name('SessionId') //(optional) Name of the session
        ->id('ABC123')      //(optional) Id of the session

    function ($request, $response, $next) {
        //Use the global $_SESSION variable to get/set data
        $_SESSION['name'] = 'John';

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //(recomended) to detect html responses
    Middleware::formatNegotiator(),

    Middleware::Piwik()
        ->piwikUrl('//example.com/piwik')    // The url of the installed piwik
        ->siteId(1)                          // (optional) The site id (1 by default)
        ->addOption('setDoNotTrack', 'true') // (optional) Add more options to piwik API
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::ReadResponse('path/to/files') // Path where the files are stored
        ->appendQuery(true)                   // (optional) to use the uri query in the filename
        ->continueOnError(true)               // (optional) to continue with the next middleware on error or not
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //secret') //The secret key
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Rename([
        '/admin' => '/admin-19640983',
    ]),

    function ($request, $response, $next) {
        $path = $request->getUri()->getPath(); // /admin

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::ResponseTime()
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Robots(false) //(optional) Set true to allow search engines instead disallow
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::SaveResponse('path/to/files') //Path directory where save the responses
        ->appendQuery(true)                   // (optional) to append the uri query to the filename
];

use Psr7Middlewares\Middleware;

function shutdownHandler ($request, $response, $app) {
    $response->getBody()->write('Service unavailable');
}

$middlewares = [

    Middleware::Shutdown('shutdownHandler') //(optional) Callable that generate the response
        ->arguments($app)                   //(optional) to add extra arguments to the handler
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::TrailingSlash(true) //(optional) set true to add the trailing slash instead remove
        ->redirect(301)             //(optional) to return a 301 (seo friendly) or 302 response to the new path
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\Uuid;

$middlewares = [

    Middleware::Uuid()
        ->version(4)     //(optional) version of the identifier (1 by default). Versions 3 and 5 need more arguments (see https://github.com/ramsey/uuid#examples)
        ->header(false), //(optional) Name of the header to store the identifier (X-Uuid by default). Set false to don't save header

    function ($request, $response, $next) {
        //Get the X-Uuid header
        $id = $request->getHeaderLine('X-Uuid');

        //Get the Uuid instance
        $uuid = Uuid::getUuid($request);

        echo $uuid->toString();

        return $next($request, $response);
    }
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Middleware\Whoops;
use Whoops\Run;

$whoops = new Run();

$middlewares = [

    //(recomended) to allows to choose the best handler according with the response mimetype
    Middleware::formatNegotiator(),

    Middleware::Whoops($whoops) //(optional) provide a custom whoops instance
        ->catchErrors(false)    //(optional) to catch not only exceptions but also php errors (true by default)
];

use Psr7Middlewares\Middleware;

$middlewares = [

    Middleware::Www(true) //(optional) Add www instead remove it
        ->redirect(301)   //(optional) to return a 301 (seo friendly), 302 response to the new host or false to don't redirect. (301 by default)
];

use Psr7Middlewares\Middleware;

$middlewares = [

    //This middleware can return a cached response
    //so the next middleware may not be executed
    Middleware::cache($myPsr6CachePool),

    //Let's say this middleware is expensive, so use a proxy for lazy creation
    Middleware::create(function () use ($app) {
        return Middleware::auraRouter($app->get('router'));
    }),

    //This middleware is needed only in production
    Middleware::create(function () {
        return (getenv('ENV') !== 'production') ? false : Middleware::minify();
    }),

    //This middleware is needed in some cases
    Middleware::create(function ($request, $response) {
        if ($request->hasHeader('Foo')) {
            return Middleware::www();
        }

        return false;
    }),

    //This middleware is needed only in a specific basePath
    Middleware::create('/admin', function () {
        return Middleware::DigestAuthentication(['user' => 'pass']);
    }),

    //This middleware is needed in some cases under a specific basePath
    Middleware::create('/actions', function ($request, $response) {
        if ($request->hasHeader('Foo')) {
            return Middleware::responseTime();
        }

        return false;
    }),
];

use Psr7Middlewares\Middleware;
use Psr7Middlewares\Transformers\BodyParser;
use Psr\Http\Message\ServerRequestInterface;

class MyBodyParser extends BodyParser
{
    /**
     * New parser used in request with the format "php"
     */
    public function php(ServerRequestInterface $request)
    {
        $data = unserialize((string) $request->getBody());

        return $request->withParsedBody($data);
    }
}

//Use the resolver
$middlewares = [
    Middleware::Payload()->resolver(new MyBodyParser())
];