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

Commit

Permalink
Merge pull request #511 from mano87/master
Browse files Browse the repository at this point in the history
Added custom layout support in NotFoundDelegate
  • Loading branch information
weierophinney committed Oct 9, 2017
2 parents 91daf13 + 697e597 commit a757bf1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 10 deletions.
5 changes: 4 additions & 1 deletion src/Container/NotFoundDelegateFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ public function __invoke(ContainerInterface $container)
$template = isset($config['zend-expressive']['error_handler']['template_404'])
? $config['zend-expressive']['error_handler']['template_404']
: NotFoundDelegate::TEMPLATE_DEFAULT;
$layout = isset($config['zend-expressive']['error_handler']['layout'])
? $config['zend-expressive']['error_handler']['layout']
: NotFoundDelegate::LAYOUT_DEFAULT;

return new NotFoundDelegate(new Response(), $renderer, $template);
return new NotFoundDelegate(new Response(), $renderer, $template, $layout);
}
}
21 changes: 15 additions & 6 deletions src/Delegate/NotFoundDelegate.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
class NotFoundDelegate implements DelegateInterface
{
const TEMPLATE_DEFAULT = 'error::404';
const LAYOUT_DEFAULT = 'layout::error';

/**
* @var TemplateRendererInterface
Expand All @@ -35,19 +36,27 @@ class NotFoundDelegate implements DelegateInterface
*/
private $template;

/**
* @var string
*/
private $layout;

/**
* @param ResponseInterface $responsePrototype
* @param TemplateRendererInterface $renderer
* @param string $template
* @param string $layout
*/
public function __construct(
ResponseInterface $responsePrototype,
TemplateRendererInterface $renderer = null,
$template = self::TEMPLATE_DEFAULT
$template = self::TEMPLATE_DEFAULT,
$layout = self::LAYOUT_DEFAULT
) {
$this->responsePrototype = $responsePrototype;
$this->renderer = $renderer;
$this->template = $template;
$this->renderer = $renderer;
$this->template = $template;
$this->layout = $layout;
}

/**
Expand All @@ -58,7 +67,7 @@ public function __construct(
*/
public function process(ServerRequestInterface $request)
{
if (! $this->renderer) {
if (!$this->renderer) {
return $this->generatePlainTextResponse($request);
}

Expand All @@ -78,7 +87,7 @@ private function generatePlainTextResponse(ServerRequestInterface $request)
->write(sprintf(
'Cannot %s %s',
$request->getMethod(),
(string) $request->getUri()
(string)$request->getUri()
));
return $response;
}
Expand All @@ -95,7 +104,7 @@ private function generateTemplatedResponse(ServerRequestInterface $request)
{
$response = $this->responsePrototype->withStatus(StatusCodeInterface::STATUS_NOT_FOUND);
$response->getBody()->write(
$this->renderer->render($this->template, ['request' => $request])
$this->renderer->render($this->template, ['request' => $request, 'layout' => $this->layout])
);

return $response;
Expand Down
6 changes: 6 additions & 0 deletions test/Container/NotFoundDelegateFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public function testFactoryUsesConfigured404TemplateWhenPresent()
$config = [
'zend-expressive' => [
'error_handler' => [
'layout' => 'layout::error',
'template_404' => 'foo::bar',
],
],
Expand All @@ -64,6 +65,11 @@ public function testFactoryUsesConfigured404TemplateWhenPresent()
$factory = new NotFoundDelegateFactory();

$delegate = $factory($this->container->reveal());
$this->assertAttributeEquals(
$config['zend-expressive']['error_handler']['layout'],
'layout',
$delegate
);
$this->assertAttributeEquals(
$config['zend-expressive']['error_handler']['template_404'],
'template',
Expand Down
10 changes: 7 additions & 3 deletions test/Delegate/NotFoundDelegateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ public function testConstructorDoesNotRequireARenderer()
public function testConstructorCanAcceptRendererAndTemplate()
{
$renderer = $this->prophesize(TemplateRendererInterface::class)->reveal();
$layout = 'layout::error';
$template = 'foo::bar';

$delegate = new NotFoundDelegate($this->response->reveal(), $renderer, $template);
$delegate = new NotFoundDelegate($this->response->reveal(), $renderer, $template, $layout);

$this->assertInstanceOf(NotFoundDelegate::class, $delegate);
$this->assertAttributeSame($renderer, 'renderer', $delegate);
$this->assertAttributeEquals($layout, 'layout', $delegate);
$this->assertAttributeEquals($template, 'template', $delegate);
}

Expand All @@ -68,8 +70,10 @@ public function testUsesRendererToGenerateResponseContentsWhenPresent()
$request = $this->prophesize(ServerRequestInterface::class)->reveal();

$renderer = $this->prophesize(TemplateRendererInterface::class);
$renderer->render(NotFoundDelegate::TEMPLATE_DEFAULT, ['request' => $request])
->willReturn('CONTENT');
$renderer->render(NotFoundDelegate::TEMPLATE_DEFAULT, [
'request' => $request,
'layout' => NotFoundDelegate::LAYOUT_DEFAULT
])->willReturn('CONTENT');

$stream = $this->prophesize(StreamInterface::class);
$stream->write('CONTENT')->shouldBeCalled();
Expand Down

0 comments on commit a757bf1

Please sign in to comment.