Post/Redirect/Get Middleware for Zend Expressive
Intro
This is simple middleware that'll help you implement the PRG pattern in your Zend Expressive app., (*1)
Based on the original Zend Framework PRG controller plugin., (*2)
Uses Zend\Session but performs no configuration of the session itself. I figured this was a sane choice for session management. If you know of a standard session library to typehint against, let me know, but afaik there isn't one…, (*3)
Installation
$ composer require netglue/expressive-prg
Usage
First you'll need to register the middleware with your DI container as an invokable with something like:, (*4)
// use NetglueExpressive\Middleware\PostRedirectGet;
'dependencies' => [
'invokables' => [
PostRedirectGet::class => PostRedirectGet::class
],
],
Add the middleware to your routes whenever you want to perform a PRG something like this:, (*5)
'routes' => [
'some-form' => [
'name' => 'some-form',
'path' => '/somewhere',
'allowed_methods' => ['GET', 'POST'],
'middleware' => [
PostRedirectGet::class
// Your middleware to post process, render templates etc…
],
],
],
Inside your action, the request will have an attribute prg set to either false or the posted data (If any), for example:, (*6)
$post = $request->getAttribute('prg');
if (false === $post) {
// No POST has occurred, probably render the form template
}
// Otherwise, process POST data, validate, store, whatever…
The request attribute name is defined as a constant in PostRedirectGet::KEY, (*7)
It is possible for the attribute to be null if the request is neither a GET, nor a POST request and your route allows other methods such as PUT, DELETE etc…, (*8)
Tests
$ cd vendor/netglue/expressive-prg
$ composer install
$ phpunit
About
Netglue makes web based stuff in Devon, England. We hope this is useful to you and we’d appreciate feedback either way :), (*9)