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::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())
];
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.