Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Provide a dedicated service for server request error response generation#562

Merged
weierophinney merged 5 commits intozendframework:release-3.0.0fromweierophinney:hotfix/use-constants-not-virtual-services
Feb 22, 2018
Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletionsCHANGELOG.md
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,11 @@ All notable changes to this project will be documented in this file, in reverse

### Added

- Nothing.
- [#562](https://github.com/zendframework/zend-expressive/pull/562) adds the
class `Zend\Expressive\Response\ServerRequestErrorResponseGenerator`, and maps
it to the `Zend\Expressive\Container\ServerRequestErrorResponseGeneratorFactory`.
The class generates an error response when an exeption occurs producing a
server request instance, and can be optionally templated.

### Changed

Expand All@@ -20,13 +24,28 @@ All notable changes to this project will be documented in this file, in reverse
creates, as that class changes in 3.0.0alpha4 such that it now expects a
factory instead of an instance.

- [#562](https://github.com/zendframework/zend-expressive/pull/562) modifies the
`Zend\Expressive\Container\RequestHandlerRunnerFactory` to depend on the
`Zend\Expressive\Response\ServerRequestErrorResponseGenerator` service instead
of the `Zend\Expressive\SERVER_REQUEST_ERROR_RESPONSE_GENERATOR` virtual
service.

- [#562](https://github.com/zendframework/zend-expressive/pull/562) extracts
most logic from `Zend\Expressive\Middleware\ErrorResponseGenerator` to a new
trait, `Zend\Expressive\Response\ErrorResponseGeneratorTrait`. A trait was
used as the classes consuming it are from different namespaces, and thus
different inheritance trees. The trait is used by both the
`ErrorResponseGenerator` and the new `ServerRequestErrorResponseGenerator`.

### Deprecated

- Nothing.

### Removed

- Nothing.
- [#562](https://github.com/zendframework/zend-expressive/pull/562) removes the
constant `Zend\Expressive\SERVER_REQUEST_ERROR_RESPONSE_GENERATOR`. It was
only used internally previously.

### Fixed

Expand Down
4 changes: 3 additions & 1 deletionsrc/ConfigProvider.php
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ public function __invoke() : array

public function getDependencies() : array
{
// @codingStandardsIgnoreStart
return [
'aliases' => [
DEFAULT_DELEGATE => Handler\NotFoundHandler::class,
Expand All@@ -53,10 +54,11 @@ public function getDependencies() : array
Middleware\ErrorResponseGenerator::class => Container\ErrorResponseGeneratorFactory::class,
RequestHandlerRunner::class => Container\RequestHandlerRunnerFactory::class,
ResponseInterface::class => Container\ResponseFactoryFactory::class,
SERVER_REQUEST_ERROR_RESPONSE_GENERATOR => Container\ServerRequestErrorResponseGeneratorFactory::class,
Response\ServerRequestErrorResponseGenerator::class => Container\ServerRequestErrorResponseGeneratorFactory::class,
ServerRequestInterface::class => Container\ServerRequestFactoryFactory::class,
StreamInterface::class => Container\StreamFactoryFactory::class,
],
];
// @codingStandardsIgnoreEnd
}
}
13 changes: 6 additions & 7 deletionssrc/Container/RequestHandlerRunnerFactory.php
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,27 +12,26 @@
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Zend\Expressive\ApplicationPipeline;
use Zend\Expressive\ServerRequestErrorResponseGenerator;
use Zend\Expressive\Response\ServerRequestErrorResponseGenerator;
use Zend\HttpHandlerRunner\Emitter\EmitterInterface;
use Zend\HttpHandlerRunner\RequestHandlerRunner;

/**
* Create an ApplicationRunner instance.
*
* This class consumes three pseudo-services (services that look like class
* names, but resolve to other artifacts):
* This class consumes two pseudo-services (services that look like class
* names, but resolve to other artifacts) and two services provided within
* this package:
*
* - Zend\Expressive\ApplicationPipeline, which should resolve to a
* Zend\Stratigility\MiddlewarePipeInterface and/or
* Psr\Http\Server\RequestHandlerInterface instance.
* - Zend\HttpHandlerRunner\Emitter\EmitterInterface.
* - Psr\Http\Message\ServerRequestInterface, which should resolve to a PHP
* callable that will return a Psr\Http\Message\ServerRequestInterface
* instance.
* - Zend\Expressive\ServerRequestErrorResponseGenerator, which should resolve
* to a PHP callable that accepts a Throwable argument, and which will return
* a Psr\Http\Message\ResponseInterface instance.
* - Zend\Expressive\Response\ServerRequestErrorResponseGeneratorFactory,
*
* It also consumes the service Zend\HttpHandlerRunner\Emitter\EmitterInterface.
*/
class RequestHandlerRunnerFactory
{
Expand Down
27 changes: 19 additions & 8 deletionssrc/Container/ServerRequestErrorResponseGeneratorFactory.php
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,18 +11,29 @@

use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Throwable;
use Zend\Diactoros\Response;
use Zend\Diactoros\ServerRequest;
use Zend\Expressive\Middleware\ErrorResponseGenerator;
use Zend\Expressive\Response\ServerRequestErrorResponseGenerator;
use Zend\Expressive\Template\TemplateRendererInterface;

class ServerRequestErrorResponseGeneratorFactory
{
public function __invoke(ContainerInterface $container) :callable
public function __invoke(ContainerInterface $container) :ServerRequestErrorResponseGenerator
{
return function (Throwable $e) use ($container) : ResponseInterface {
$generator = $container->get(ErrorResponseGenerator::class);
return $generator($e, new ServerRequest(), new Response());
};
$config = $container->has('config') ? $container->get('config') : [];
$debug = $config['debug'] ?? false;

$renderer = $container->has(TemplateRendererInterface::class)
? $container->get(TemplateRendererInterface::class)
: null;

$template = $config['zend-expressive']['error_handler']['template_error']
?? ServerRequestErrorResponseGenerator::TEMPLATE_DEFAULT;

return new ServerRequestErrorResponseGenerator(
$container->get(ResponseInterface::class),
$debug,
$renderer,
$template
);
}
}
102 changes: 17 additions & 85 deletionssrc/Middleware/ErrorResponseGenerator.php
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,38 +12,15 @@
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Throwable;
use Zend\Expressive\Response\ErrorResponseGeneratorTrait;
use Zend\Expressive\Template\TemplateRendererInterface;
use Zend\Stratigility\Utils;

class ErrorResponseGenerator
{
public const TEMPLATE_DEFAULT = 'error::error';

/**
* @var bool
*/
private $debug;

/**
* @var TemplateRendererInterface
*/
private $renderer;

/**
* @var string
*/
private $stackTraceTemplate = <<<'EOT'
%s raised in file %s line %d:
Message: %s
Stack Trace:
%s
use ErrorResponseGeneratorTrait;

EOT;

/**
* @var string
*/
private $template;
public const TEMPLATE_DEFAULT = 'error::error';

public function __construct(
bool $isDevelopmentMode = false,
Expand All@@ -63,66 +40,21 @@ public function __invoke(
$response = $response->withStatus(Utils::getStatusCode($e, $response));

if ($this->renderer) {
return $this->prepareTemplatedResponse($e, $request, $response);
}

return $this->prepareDefaultResponse($e, $response);
}

private function prepareTemplatedResponse(
Throwable $e,
ServerRequestInterface $request,
ResponseInterface $response
) : ResponseInterface {
$templateData = [
'response' => $response,
'request' => $request,
'uri' => (string) $request->getUri(),
'status' => $response->getStatusCode(),
'reason' => $response->getReasonPhrase(),
];

if ($this->debug) {
$templateData['error'] = $e;
}

$response->getBody()->write(
$this->renderer->render($this->template, $templateData)
);

return $response;
}

private function prepareDefaultResponse(Throwable $e, ResponseInterface $response) : ResponseInterface
{
$message = 'An unexpected error occurred';

if ($this->debug) {
$message .= "; strack trace:\n\n" . $this->prepareStackTrace($e);
}

$response->getBody()->write($message);

return $response;
}

/**
* Prepares a stack trace to display.
*/
private function prepareStackTrace(Throwable $e) : string
{
$message = '';
do {
$message .= sprintf(
$this->stackTraceTemplate,
get_class($e),
$e->getFile(),
$e->getLine(),
$e->getMessage(),
$e->getTraceAsString()
return $this->prepareTemplatedResponse(
$e,
$this->renderer,
[
'response' => $response,
'request' => $request,
'uri' => (string) $request->getUri(),
'status' => $response->getStatusCode(),
'reason' => $response->getReasonPhrase(),
],
$this->debug,
$response
);
} while ($e = $e->getPrevious());
}

return $message;
return $this->prepareDefaultResponse($e, $this->debug, $response);
}
}
100 changes: 100 additions & 0 deletionssrc/Response/ErrorResponseGeneratorTrait.php
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
<?php
/**
* @see https://github.com/zendframework/zend-expressive for the canonical source repository
* @copyright Copyright (c) 2018 Zend Technologies USA Inc. (https://www.zend.com)
* @license https://github.com/zendframework/zend-expressive/blob/master/LICENSE.md New BSD License
*/

declare(strict_types=1);

namespace Zend\Expressive\Response;

use Psr\Http\Message\ResponseInterface;
use Throwable;
use Zend\Expressive\Template\TemplateRendererInterface;

trait ErrorResponseGeneratorTrait
{
/**
* Whether or not we are in debug/development mode.
*
* @var bool
*/
private $debug;

/**
* @param TemplateRendererInterface
*/
private $renderer;

/**
* @var string
*/
private $stackTraceTemplate = <<<'EOT'
%s raised in file %s line %d:
Message: %s
Stack Trace:
%s

EOT;

/**
* Name of the template to render.
*
* @var string
*/
private $template;

private function prepareTemplatedResponse(
Throwable $e,
TemplateRendererInterface $renderer,
array $templateData,
bool $debug,
ResponseInterface $response
) : ResponseInterface {
if ($debug) {
$templateData['error'] = $e;
}

$response->getBody()
->write($renderer->render($this->template, $templateData));

return $response;
}

private function prepareDefaultResponse(
Throwable $e,
bool $debug,
ResponseInterface $response
) : ResponseInterface {
$message = 'An unexpected error occurred';

if ($debug) {
$message .= "; stack trace:\n\n" . $this->prepareStackTrace($e);
}

$response->getBody()->write($message);

return $response;
}

/**
* Prepares a stack trace to display.
*/
private function prepareStackTrace(Throwable $e) : string
{
$message = '';
do {
$message .= sprintf(
$this->stackTraceTemplate,
get_class($e),
$e->getFile(),
$e->getLine(),
$e->getMessage(),
$e->getTraceAsString()
);
} while ($e = $e->getPrevious());

return $message;
}
}
Loading

[8]ページ先頭

©2009-2025 Movatter.jp