Comments (3)
It depends on what code you have in those actions. Usually you return a Response object in an action middleware. Which basically means you will not execute the second action but go back through all the previous middleware.
What you can have in that middleware is something like this:
'middleware' => [
Middleware\SessionMiddleware::class,
Middleware\AuthMiddleware::class,
Action\PostAction::class
],
Originally posted by @geerteltink at zendframework/zend-expressive#361 (comment)
from mezzio.
Both actions return $next(...) if there is $next.
Here an example case:
test.global.php
<?php
return [
'dependencies' => [
'invokables' => [
App\ErrorHandler::class => App\ErrorHandler::class,
App\TestAction::class => App\TestAction::class,
App\TestAction2::class => App\TestAction2::class,
],
],
'routes' => [
[
'name' => 'test',
'path' => '/test',
'middleware' => [
App\TestAction::class,
App\TestAction2::class,
],
'allowed_methods' => ['POST'],
],
],
'middleware_pipeline' => [
[
'middleware' => App\ErrorHandler::class,
'priority' => PHP_INT_MAX, // always first
],
],
];
App\ErrorHandler.php
<?php
namespace App;
use Zend\Stratigility\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
class ErrorHandler implements MiddlewareInterface
{
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
) {
file_put_contents('data/test.txt', __METHOD__ . PHP_EOL, FILE_APPEND);
set_error_handler(
function (
$errorNumber,
$errorString,
$errorFile = '',
$errorLine = ''
) {
file_put_contents(
'data/set_error_handler.txt',
implode(
', ',
[
$errorNumber,
$errorString,
$errorFile,
$errorLine
]
) . PHP_EOL, FILE_APPEND
);
}
);
register_shutdown_function(
function () {
$errorLast = error_get_last();
if ($errorLast) {
file_put_contents(
'data/register_shutdown_function.txt',
implode(', ', $errorLast) . PHP_EOL, FILE_APPEND
);
}
}
);
if ($next) {
$response = $next($request, $response);
}
return $response;
}
}
App\TextAction.php
<?php
namespace App;
use Zend\Stratigility\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
class TestAction implements MiddlewareInterface
{
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
) {
file_put_contents('data/test.txt', __METHOD__ . PHP_EOL, FILE_APPEND);
$response = $response->withHeader('test', 'test');
if ($next) {
$response = $next($request, $response);
}
return $response;
}
}
App\TestAction2.php
<?php
namespace App;
use Zend\Stratigility\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
class TestAction2 implements MiddlewareInterface
{
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next = null
) {
file_put_contents('data/test.txt', __METHOD__ . PHP_EOL, FILE_APPEND);
$response = $response->withHeader('test2', 'test2');
if ($next) {
$response = $next($request, $response);
}
return $response;
}
}
Without any error you will get an data/text.txt
with content:
App\ErrorHandler::__invoke
App\TestAction::__invoke
App\TestAction2::__invoke
If you now force an fatal error in App\TestAction.php
the App\ErrorHandler.php
wont get invoked.
Expected:
App\ErrorHandler::__invoke
Got: empty
If you now force an fatal error in App\TestAction2.php
the App\ErrorHandler.php
will get invoked.
Expected:
App\ErrorHandler::__invoke
App\TestAction::__invoke
Got:
App\ErrorHandler::__invoke
App\TestAction::__invoke
For some reason the register_shutdown_function
wont get executed at all in this cases oO?
Originally posted by @cottton at zendframework/zend-expressive#361 (comment)
from mezzio.
@sergu44o What version are you using? This issue is almost 2 years old.
Originally posted by @geerteltink at zendframework/zend-expressive#361 (comment)
from mezzio.
Related Issues (20)
- Create `Mezzio\ApplicationPipeline` implementation for better static code analysis HOT 1
- Missing good examples of configuration template paths for laminas-view in mezzio HOT 3
- Replace `RequestHandlerRunner` factory with `RequestHandlerRunnerInterface` factory HOT 3
- Page with the description of the installation is missing
- Dependency Dashboard
- [RFC]: Provide an ApplicationProgrammaticConfigDelegator that pairs with ApplicationConfigInjectionDelegator HOT 4
- Script MezzioInstaller\OptionalPackages::install handling the pre-install-cmd event terminated with an exception HOT 3
- Upgrading to PHP 8.2 breaks Dependency Injection HOT 9
- [RFC]: Remove Pimple from Mezzio documentation and from Mezzio skeleton HOT 3
- bin/mezzio-tooling is incompatible with mezzio/mezzio-tooling v2 HOT 7
- [RFC]: Deprecate `ApplicationConfigInjectionDelegator` and `Application#post`, etc.
- Provide `RouteCollectorInterface` and `MiddlewarePipeInterface` delegators to supersede `ApplicationConfigInjectionDelegator` HOT 1
- jsoumelidis/zend-sf-di-config[0.4.0, ..., 0.4.1] require php ^7.1 -> your php version 8.0.99 HOT 1
- PhpDebugBar documentation is outdated. HOT 1
- [RFC]: Mezzio v4 HOT 2
- Mezzio does not work without a router HOT 3
- Using ApplicationConfigInjectionDelegator more than once (in multiple modules simultaneously) results results in a DuplicateRouteException. HOT 1
- Move router integration tests to router packages
- PHP 8.1 Support HOT 12
- Support for laminas-httphandlerrunner 2.x versions HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from mezzio.