Skip to content
This repository was archived by the owner on May 1, 2019. It is now read-only.

Commit 80e336d

Browse files
committed
Merge pull request #421 from ins0/feature/error-messages
[WIP] Feature: Flash Messenger Error Messages
2 parents 11e8e4b + daf648d commit 80e336d

File tree

17 files changed

+530
-84
lines changed

17 files changed

+530
-84
lines changed

composer.lock

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

module/Application/config/module.config.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@
9595
],
9696
],
9797
'view_helpers' => [
98+
'invokables' => [
99+
'FlashMessenger' => View\Helper\FlashMessenger::class,
100+
],
98101
'factories' => [
99102
'gitHubRepositoryUrl' => View\Helper\GitHubRepositoryUrlFactory::class,
100103
'sanitizeHtml' => View\Helper\SanitizeHtmlFactory::class,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Application\Exception;
4+
5+
class ViewableUserException extends \Exception implements ViewableUserExceptionInterface
6+
{
7+
/* @var string */
8+
private $publicMessage;
9+
10+
/**
11+
* {@inheritdoc}
12+
*/
13+
public function __construct($message = '', $publicMessage = '', $code = 0, \Exception $previous = null)
14+
{
15+
$this->publicMessage = (string) $publicMessage;
16+
parent::__construct($message, $code, $previous);
17+
}
18+
19+
/**
20+
* {@inheritdoc}
21+
*/
22+
public function getPublicMessage()
23+
{
24+
return $this->publicMessage;
25+
}
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Application\Exception;
4+
5+
interface ViewableUserExceptionInterface
6+
{
7+
/**
8+
* @param string $message Error Message for internal logging
9+
* @param string $publicMessage Public Error Message
10+
* @param int $code Error Code
11+
* @param \Exception $previous Previous Exception
12+
*/
13+
public function __construct($message = '', $publicMessage = '', $code = 0, \Exception $previous = null);
14+
15+
/**
16+
* Returns the Public Error Message
17+
* @return string
18+
*/
19+
public function getPublicMessage();
20+
}
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
namespace Application\View\Helper;
3+
4+
use Zend\Mvc\Controller\Plugin\FlashMessenger as PluginFlashMessenger;
5+
use Zend\View\Helper\FlashMessenger as ZendFlashMessenger;
6+
7+
class FlashMessenger extends ZendFlashMessenger
8+
{
9+
/* @var string[][] */
10+
private $classOptions = [];
11+
12+
/**
13+
* Render Messages in a BS message format
14+
*
15+
* @param callable $renderer
16+
* @param string $namespace
17+
* @param string[] $classes
18+
* @return string
19+
*/
20+
private function doRender($renderer, $namespace, array $classes = [])
21+
{
22+
$this->classOptions = [
23+
PluginFlashMessenger::NAMESPACE_INFO => [
24+
'name' => 'Information',
25+
'class' => 'alert alert-info',
26+
],
27+
PluginFlashMessenger::NAMESPACE_ERROR => [
28+
'name' => 'Error',
29+
'class' => 'alert alert-danger',
30+
],
31+
PluginFlashMessenger::NAMESPACE_SUCCESS => [
32+
'name' => 'Success',
33+
'class' => 'alert alert-success',
34+
],
35+
PluginFlashMessenger::NAMESPACE_DEFAULT => [
36+
'name' => 'Message',
37+
'class' => 'alert alert-info',
38+
],
39+
PluginFlashMessenger::NAMESPACE_WARNING => [
40+
'name' => 'Warning',
41+
'class' => 'alert alert-warning',
42+
],
43+
];
44+
45+
// if custom namespace handle as default message
46+
if (!isset($this->classOptions[$namespace])) {
47+
$this->classOptions = [
48+
$namespace => $this->classOptions[PluginFlashMessenger::NAMESPACE_DEFAULT],
49+
];
50+
}
51+
52+
$messageOutput = '';
53+
$translator = $this->getTranslator();
54+
55+
foreach ($this->classOptions as $currentNamespace => $options) {
56+
$this->classMessages[$currentNamespace] = $options['class'];
57+
$openingString = sprintf('<div%%s><span class="sr-only">%s</span>', $translator->translate($options['name']));
58+
59+
$this->setMessageOpenFormat($openingString);
60+
$this->setMessageSeparatorString(sprintf('</div>%s', $openingString));
61+
$this->setMessageCloseString('</div>');
62+
63+
$messageOutput .= $renderer($currentNamespace, $classes);
64+
}
65+
66+
return $messageOutput;
67+
}
68+
69+
/**
70+
* {@inheritdoc}
71+
*/
72+
public function render($namespace = PluginFlashMessenger::NAMESPACE_DEFAULT, array $classes = [])
73+
{
74+
$renderer = function ($namespace, $classes) {
75+
return parent::render($namespace, $classes);
76+
};
77+
78+
return $this->doRender($renderer, $namespace, $classes);
79+
}
80+
81+
/**
82+
* {@inheritdoc}
83+
*/
84+
public function renderCurrent($namespace = PluginFlashMessenger::NAMESPACE_DEFAULT, array $classes = [])
85+
{
86+
$renderer = function ($namespace, $classes) {
87+
return parent::renderCurrent($namespace, $classes);
88+
};
89+
90+
return $this->doRender($renderer, $namespace, $classes);
91+
}
92+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace ApplicationTest\Exception;
4+
5+
use Application\Exception;
6+
use PHPUnit_Framework_TestCase;
7+
8+
class ViewableUserExceptionTest extends PHPUnit_Framework_TestCase
9+
{
10+
public function testExceptionCanBeCreated()
11+
{
12+
$parentExceptionMock = $this->getMock(\Exception::class);
13+
14+
$exception = new Exception\ViewableUserException(
15+
'fooMessage',
16+
'fooPublicMessage',
17+
666,
18+
$parentExceptionMock
19+
);
20+
21+
$this->assertSame('fooMessage', $exception->getMessage());
22+
$this->assertSame('fooPublicMessage', $exception->getPublicMessage());
23+
$this->assertSame(666, $exception->getCode());
24+
$this->assertSame($parentExceptionMock, $exception->getPrevious());
25+
}
26+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace ApplicationTest\Integration\View\Helper;
4+
5+
use ApplicationTest\Integration\Util\Bootstrap;
6+
use PHPUnit_Framework_TestCase;
7+
8+
/**
9+
* @covers Application\View\Helper\FlashMessenger
10+
*/
11+
class FlashMessengerTest extends PHPUnit_Framework_TestCase
12+
{
13+
public function testMultipleMessageTypesGetsRendered()
14+
{
15+
$serviceManager = Bootstrap::getServiceManager();
16+
17+
/* @var $flashMessengerControllerPlugin \Zend\Mvc\Controller\Plugin\FlashMessenger */
18+
$flashMessengerControllerPlugin = $serviceManager->get('ControllerPluginManager')->get('FlashMessenger');
19+
20+
$flashMessengerControllerPlugin->addMessage('FooMessage');
21+
$flashMessengerControllerPlugin->addSuccessMessage('FooSuccess');
22+
$flashMessengerControllerPlugin->addWarningMessage('FooWarning');
23+
$flashMessengerControllerPlugin->addErrorMessage('FooError');
24+
$flashMessengerControllerPlugin->addInfoMessage('FooInfo');
25+
26+
/* @var \Application\View\Helper\FlashMessenger $flashMessengerViewHelper */
27+
$flashMessengerViewHelper = $serviceManager->get('ViewHelperManager')->get('FlashMessenger');
28+
29+
$this->assertEquals(
30+
'<div class="alert alert-info"><span class="sr-only">Information</span>FooInfo</div>' .
31+
'<div class="alert alert-danger"><span class="sr-only">Error</span>FooError</div>' .
32+
'<div class="alert alert-success"><span class="sr-only">Success</span>FooSuccess</div>' .
33+
'<div class="alert alert-info"><span class="sr-only">Message</span>FooMessage</div>' .
34+
'<div class="alert alert-warning"><span class="sr-only">Warning</span>FooWarning</div>',
35+
$flashMessengerViewHelper->renderCurrent()
36+
);
37+
}
38+
39+
public function testCustomNamespaceMessageGetsRenderedAsInformationMessage()
40+
{
41+
$serviceManager = Bootstrap::getServiceManager();
42+
43+
/* @var $flashMessengerControllerPlugin \Zend\Mvc\Controller\Plugin\FlashMessenger */
44+
$flashMessengerControllerPlugin = $serviceManager->get('ControllerPluginManager')->get('FlashMessenger');
45+
$flashMessengerControllerPlugin->setNamespace('FooBar');
46+
47+
$flashMessengerControllerPlugin->addMessage('FooMessage');
48+
49+
/* @var \Application\View\Helper\FlashMessenger $flashMessengerViewHelper */
50+
$flashMessengerViewHelper = $serviceManager->get('ViewHelperManager')->get('FlashMessenger');
51+
52+
$this->assertEquals(
53+
'<div class="alert alert-info"><span class="sr-only">Message</span>FooMessage</div>',
54+
$flashMessengerViewHelper->renderCurrent('FooBar')
55+
);
56+
}
57+
}

module/Application/view/error/404.phtml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<h1>A 404 error occurred</h1>
2-
<h2><?php echo $this->message ?></h2>
3-
2+
<hr>
43
<?php if (isset($this->reason) && $this->reason): ?>
54
<?php
65
$reasonMessage = '';
@@ -22,7 +21,10 @@
2221
break;
2322
}
2423
?>
25-
<p><?php echo $reasonMessage ?></p>
24+
<div class="alert alert-danger alert-error">
25+
<strong><?php echo $this->message ?></strong>
26+
<p><?php echo $reasonMessage ?></p>
27+
</div>
2628
<?php endif ?>
2729

2830
<?php if (isset($this->controller) && $this->controller): ?>

module/Application/view/error/index.phtml

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
1-
<h1>An error occurred</h1>
2-
<h2><?php echo $this->message ?></h2>
1+
<?php
2+
use Application\Exception;
3+
?>
4+
<h1>Oops. Something went wrong.</h1>
5+
<div class="alert alert-danger alert-error">
6+
<strong>Error</strong>
7+
<p>
8+
<?php
9+
if($this->exception instanceof Exception\ViewableUserException && $this->exception->getPublicMessage()): ?>
10+
<?php echo $this->escapeHtml($this->exception->getPublicMessage()); ?>
11+
<?php else: ?>
12+
Sorry, we got no more information
13+
<?php endif; ?>
14+
</p>
15+
</div>
316

417
<?php if (isset($this->display_exceptions) && $this->display_exceptions): ?>
5-
<?php if (isset($this->exception) && $this->exception instanceof Exception): ?>
18+
<?php if (isset($this->exception) && $this->exception instanceof \Exception): ?>
619
<hr/>
720
<h2>Additional information:</h2>
821
<h3><?php echo get_class($this->exception); ?></h3>

module/User/src/User/GitHub/LoginListener.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class LoginListener implements SharedListenerAggregateInterface
1616
protected $listeners = [];
1717

1818
/**
19-
* @inheritdoc
19+
* {@inheritdoc}
2020
*/
2121
public function attachShared(SharedEventManagerInterface $events)
2222
{
@@ -28,7 +28,7 @@ public function attachShared(SharedEventManagerInterface $events)
2828
}
2929

3030
/**
31-
* @inheritdoc
31+
* {@inheritdoc}
3232
*/
3333
public function detachShared(SharedEventManagerInterface $events)
3434
{

0 commit comments

Comments
 (0)