Passed
Pull Request — master (#44)
by Alberto
03:22
created

ExceptionRenderer::getHttpCode()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
declare(strict_types=1);
3
4
/**
5
 * BEdita, API-first content management framework
6
 * Copyright 2018 ChannelWeb Srl, Chialab Srl
7
 *
8
 * This file is part of BEdita: you can redistribute it and/or modify
9
 * it under the terms of the GNU Lesser General Public License as published
10
 * by the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * See LICENSE.LGPL or <http://gnu.org/licenses/lgpl-3.0.html> for more details.
14
 */
15
16
namespace BEdita\WebTools\Error;
17
18
use BEdita\SDK\BEditaClientException;
19
use Cake\Error\ExceptionRenderer as CakeExceptionRenderer;
20
use Cake\Http\Response;
21
use Cake\Log\LogTrait;
22
23
/**
24
 * Custom exception renderer class.
25
 * Handle with templates 500 and 400 (for status code < 500).
26
 */
27
class ExceptionRenderer extends CakeExceptionRenderer
28
{
29
    use LogTrait;
30
31
    /**
32
     * @inheritDoc
33
     */
34
    protected function _template(\Throwable $exception, string $method, int $code): string
35
    {
36
        $template = 'error500';
37
        if ($code < 500) {
38
            $template = 'error400';
39
        }
40
41
        return $this->template = $template;
42
    }
43
44
    /**
45
     * {@inheritDoc}
46
     *
47
     * Handle BEditaClientException.
48
     */
49
    protected function getHttpCode(\Throwable $exception): int
50
    {
51
        if ($exception instanceof BEditaClientException) {
52
            return $exception->getCode();
53
        }
54
55
        return parent::getHttpCode($exception);
56
    }
57
58
    /**
59
     * @inheritDoc
60
     */
61
    protected function _outputMessageSafe(string $template): Response
62
    {
63
        $builder = $this->controller->viewBuilder();
64
        $builder->setLayoutPath('')
65
            ->setTemplatePath('Error');
66
67
        // first try to use AppView class. Fallback to internal template on failure
68
        try {
69
            $view = $this->controller->createView();
70
            $body = $view->render($template, 'error');
71
        } catch (\Exception $e) {
72
            // first log the new exception to trace the new error too.
73
            $this->log($e->getMessage());
74
75
            $helpers = ['Form', 'Html'];
76
            $builder->setHelpers($helpers, false);
77
78
            $view = $this->controller->createView('View');
79
            $body = $view->render('BEdita/WebTools.' . $template, 'BEdita/WebTools.error');
80
        }
81
82
        return $this->controller->getResponse()->withStringBody($body)->withType('html');
83
    }
84
}
85