Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 93b734d

Browse files
committed
Added an exception listener
1 parent 89f17e2 commit 93b734d

5 files changed

Lines changed: 86 additions & 4 deletions

File tree

app/config/services.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ services:
3333
app.github.listener_factory:
3434
class: AppBundle\Issues\GitHubListenerFactory
3535
arguments: ['@app.github.labels_api', '%github_listeners%']
36+
37+
app.github.exception_listener:
38+
class: Appbundle\Listener\ExceptionListener
39+
tags:
40+
- { name: kernel.event_subscriber }

src/AppBundle/Controller/WebhookController.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace AppBundle\Controller;
44

55
use AppBundle\Event\GitHubEvent;
6+
use AppBundle\Exception\GitHubException;
67
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
78
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
89
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@@ -19,12 +20,12 @@ public function githubAction(Request $request)
1920
{
2021
$data = json_decode($request->getContent(), true);
2122
if (null === $data) {
22-
throw new \Exception('Invalid JSON body!');
23+
throw new GitHubException('Invalid JSON body!');
2324
}
2425

2526
$repository = isset($data['repository']['full_name']) ? $data['repository']['full_name'] : null;
2627
if (empty($repository)) {
27-
throw new \Exception('No repository name!');
28+
throw new GitHubException('No repository name!');
2829
}
2930

3031
$listener = $this->get('app.github.listener_factory')->createFromRepository($repository);
@@ -35,7 +36,11 @@ public function githubAction(Request $request)
3536
$event = new GitHubEvent($data);
3637
$eventName = $request->headers->get('X-Github-Event');
3738

38-
$dispatcher->dispatch('github.'.$eventName, $event);
39+
try {
40+
$dispatcher->dispatch('github.'.$eventName, $event);
41+
} catch (\Exception $e) {
42+
throw new GitHubException(sprintf('Failed dispatching "%s" event for "%s" repository.', $eventName, $repository), 0, $e);
43+
}
3944

4045
$responseData = $event->getResponseData();
4146

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace AppBundle\Exception;
13+
14+
/**
15+
* GitHubException.
16+
*
17+
* @author Jules Pietri <[email protected]>
18+
*/
19+
class GitHubException extends \Exception
20+
{
21+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace AppBundle\Listener;
13+
14+
use AppBundle\Exception\GitHubException;
15+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16+
use Symfony\Component\HttpFoundation\JsonResponse;
17+
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
18+
use Symfony\Component\HttpKernel\KernelEvents;
19+
20+
/**
21+
* ExceptionListener.
22+
*
23+
* @author Jules Pietri <[email protected]>
24+
*/
25+
class ExceptionListener implements EventSubscriberInterface
26+
{
27+
public function onGitHubException(GetResponseForExceptionEvent $event)
28+
{
29+
$exception = $event->getException();
30+
if (!$exception instanceof GitHubException) {
31+
return;
32+
}
33+
34+
$message = $exception->getMessage();
35+
if ($previous = $exception->getPrevious()) {
36+
$message .= ' => '.$previous->getMessage();
37+
}
38+
39+
$event->setResponse(new JsonResponse(array('error' => $message), 500));
40+
}
41+
42+
/**
43+
* {@inheritdoc}
44+
*/
45+
public static function getSubscribedEvents()
46+
{
47+
return array(
48+
KernelEvents::EXCEPTION => 'onGitHubException',
49+
);
50+
}
51+
}

src/AppBundle/Tests/Controller/WebhookControllerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function testIssueComment($eventHeader, $payloadFilename, $expectedRespon
1717
$response = $client->getResponse();
1818

1919
$responseData = json_decode($response->getContent(), true);
20-
$this->assertSame(200, $response->getStatusCode());
20+
$this->assertSame(200, $response->getStatusCode(), isset($responseData['error']) ? $responseData['error'] : 'An error occurred.');
2121

2222
// a weak sanity check that we went down "the right path" in the controller
2323
$this->assertSame($expectedResponse, $responseData);

0 commit comments

Comments
 (0)