Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit 81c5f2e

Browse files
committed
Extract logic to create middleware pipe into private method
1 parent ab63639 commit 81c5f2e

File tree

3 files changed

+119
-28
lines changed

3 files changed

+119
-28
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
/**
3+
* Zend Framework (http://framework.zend.com/)
4+
*
5+
* @link http://github.com/zendframework/zf2 for the canonical source repository
6+
* @copyright Copyright (c) 2005-2017 Zend Technologies USA Inc. (http://www.zend.com)
7+
* @license http://framework.zend.com/license/new-bsd New BSD License
8+
*/
9+
10+
namespace Zend\Mvc\Exception;
11+
12+
final class MiddlewareNotCallableException extends RuntimeException
13+
{
14+
/**
15+
* @var string
16+
*/
17+
private $middlewareName;
18+
19+
/**
20+
* @param string $middlewareName
21+
* @return self
22+
*/
23+
public static function fromMiddlewareName($middlewareName)
24+
{
25+
$middlewareName = (string)$middlewareName;
26+
$instance = new self(sprintf('Cannot dispatch middleware %s', $middlewareName));
27+
$instance->middlewareName = $middlewareName;
28+
return $instance;
29+
}
30+
31+
/**
32+
* @return string
33+
*/
34+
public function toMiddlewareName()
35+
{
36+
return $this->middlewareName ?? '';
37+
}
38+
}

src/MiddlewareListener.php

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99

1010
namespace Zend\Mvc;
1111

12+
use Interop\Container\ContainerInterface;
1213
use Psr\Http\Message\ResponseInterface as PsrResponseInterface;
14+
use Psr\Http\Message\ResponseInterface;
1315
use Psr\Http\Message\ServerRequestInterface as PsrServerRequestInterface;
1416
use Zend\EventManager\AbstractListenerAggregate;
1517
use Zend\EventManager\EventManagerInterface;
18+
use Zend\Mvc\Exception\MiddlewareNotCallableException;
1619
use Zend\Mvc\Exception\ReachedFinalHandlerException;
1720
use Zend\Psr7Bridge\Psr7ServerRequest as Psr7Request;
1821
use Zend\Psr7Bridge\Psr7Response;
@@ -52,31 +55,22 @@ public function onDispatch(MvcEvent $event)
5255
$serviceManager = $application->getServiceManager();
5356

5457
$psr7ResponsePrototype = Psr7Response::fromZend($response);
55-
$pipe = new MiddlewarePipe();
56-
$pipe->setResponsePrototype($psr7ResponsePrototype);
57-
58-
$middlewaresToBePiped = !is_array($middleware) ? [$middleware] : $middleware;
59-
60-
$middlewareName = 'noMiddlewarePiped';
61-
$middlewareToBePiped = null;
62-
foreach ($middlewaresToBePiped as $middlewareToBePiped) {
63-
$middlewareName = is_string($middlewareToBePiped) ? $middlewareToBePiped : get_class($middlewareToBePiped);
64-
65-
if (is_string($middlewareToBePiped) && $serviceManager->has($middlewareToBePiped)) {
66-
$middlewareToBePiped = $serviceManager->get($middlewareToBePiped);
67-
}
68-
if (! is_callable($middlewareToBePiped)) {
69-
$return = $this->marshalMiddlewareNotCallable(
70-
$application::ERROR_MIDDLEWARE_CANNOT_DISPATCH,
71-
$middlewareName,
72-
$event,
73-
$application
74-
);
75-
$event->setResult($return);
76-
return $return;
77-
}
7858

79-
$pipe->pipe($middlewareToBePiped);
59+
try {
60+
$pipe = $this->createPipeFromSpec(
61+
$serviceManager,
62+
$psr7ResponsePrototype,
63+
is_array($middleware) ? $middleware : [$middleware]
64+
);
65+
} catch (MiddlewareNotCallableException $middlewareNotCallableException) {
66+
$return = $this->marshalMiddlewareNotCallable(
67+
$application::ERROR_MIDDLEWARE_CANNOT_DISPATCH,
68+
$middlewareNotCallableException->toMiddlewareName(),
69+
$event,
70+
$application
71+
);
72+
$event->setResult($return);
73+
return $return;
8074
}
8175

8276
$caughtException = null;
@@ -103,10 +97,6 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
10397
if ($caughtException !== null) {
10498
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
10599
$event->setError($application::ERROR_EXCEPTION);
106-
$event->setController($middlewareName);
107-
if (null !== $middlewareToBePiped) {
108-
$event->setControllerClass(get_class($middlewareToBePiped));
109-
}
110100
$event->setParam('exception', $caughtException);
111101

112102
$events = $application->getEventManager();
@@ -126,6 +116,37 @@ function (PsrServerRequestInterface $request, PsrResponseInterface $response) {
126116
return $response;
127117
}
128118

119+
/**
120+
* Create a middleware pipe from the array spec given.
121+
*
122+
* @param ContainerInterface $serviceLocator
123+
* @param ResponseInterface $responsePrototype
124+
* @param array $middlewaresToBePiped
125+
* @return MiddlewarePipe
126+
* @throws \Zend\Mvc\Exception\MiddlewareNotCallableException
127+
*/
128+
private function createPipeFromSpec(
129+
ContainerInterface $serviceLocator,
130+
ResponseInterface $responsePrototype,
131+
array $middlewaresToBePiped
132+
) {
133+
$pipe = new MiddlewarePipe();
134+
$pipe->setResponsePrototype($responsePrototype);
135+
foreach ($middlewaresToBePiped as $middlewareToBePiped) {
136+
$middlewareName = is_string($middlewareToBePiped) ? $middlewareToBePiped : get_class($middlewareToBePiped);
137+
138+
if (is_string($middlewareToBePiped) && $serviceLocator->has($middlewareToBePiped)) {
139+
$middlewareToBePiped = $serviceLocator->get($middlewareToBePiped);
140+
}
141+
if (! is_callable($middlewareToBePiped)) {
142+
throw MiddlewareNotCallableException::fromMiddlewareName($middlewareName);
143+
}
144+
145+
$pipe->pipe($middlewareToBePiped);
146+
}
147+
return $pipe;
148+
}
149+
129150
/**
130151
* Marshal a middleware not callable exception event
131152
*
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
/**
3+
* Zend Framework (http://framework.zend.com/)
4+
*
5+
* @link http://github.com/zendframework/zf2 for the canonical source repository
6+
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7+
* @license http://framework.zend.com/license/new-bsd New BSD License
8+
*/
9+
10+
namespace ZendTest\Mvc;
11+
12+
use PHPUnit_Framework_TestCase as TestCase;
13+
use Zend\Mvc\Exception\MiddlewareNotCallableException;
14+
15+
final class MiddlewareNotCallableExceptionTest extends TestCase
16+
{
17+
public function testFromMiddlewareName()
18+
{
19+
$middlewareName = uniqid('middlewareName', true);
20+
$exception = MiddlewareNotCallableException::fromMiddlewareName($middlewareName);
21+
22+
self::assertInstanceOf(MiddlewareNotCallableException::class, $exception);
23+
self::assertSame('Cannot dispatch middleware ' . $middlewareName, $exception->getMessage());
24+
self::assertSame($middlewareName, $exception->toMiddlewareName());
25+
}
26+
27+
public function testToMiddlewareNameWhenNotSet()
28+
{
29+
$exception = new MiddlewareNotCallableException();
30+
self::assertSame('', $exception->toMiddlewareName());
31+
}
32+
}

0 commit comments

Comments
 (0)