VndErrorHandler::optionalAttribute()   A
last analyzed

Complexity

Conditions 4
Paths 8

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 9
cts 9
cp 1
rs 9.2
c 0
b 0
f 0
cc 4
eloc 9
nc 8
nop 1
crap 4
1
<?php
2
/**
3
 * This file is part of the Ray.WebFormModule package.
4
 *
5
 * @license http://opensource.org/licenses/MIT MIT
6
 */
7
namespace Ray\WebFormModule;
8
9
use Doctrine\Common\Annotations\Reader;
10
use Ray\Aop\MethodInvocation;
11
use Ray\WebFormModule\Annotation\AbstractValidation;
12
use Ray\WebFormModule\Annotation\VndError;
13
use Ray\WebFormModule\Exception\ValidationException;
14
15
final class VndErrorHandler implements FailureHandlerInterface
16
{
17
    /**
18
     * @var Reader
19
     */
20
    private $reader;
21
22 5
    public function __construct(Reader $reader)
23
    {
24 5
        $this->reader = $reader;
25 5
    }
26
27
    /**
28
     * {@inheritdoc}
29
     */
30 4
    public function handle(AbstractValidation $formValidation, MethodInvocation $invocation, AbstractForm $form)
31
    {
32 4
        unset($formValidation);
33 4
        $vndError = $this->reader->getMethodAnnotation($invocation->getMethod(), VndError::class);
34 4
        $error = new FormValidationError($this->makeVndError($form, $vndError));
0 ignored issues
show
Bug introduced by
It seems like $vndError defined by $this->reader->getMethod...tation\VndError::class) on line 33 can also be of type object; however, Ray\WebFormModule\VndErrorHandler::makeVndError() does only seem to accept null|object<Ray\WebFormM...le\Annotation\VndError>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
35
36 4
        throw new ValidationException('Validation failed.', 400, null, $error);
37
    }
38
39 4
    private function makeVndError(AbstractForm $form, VndError $vndError = null)
0 ignored issues
show
Coding Style introduced by
makeVndError uses the super-global variable $_SERVER which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
40
    {
41 4
        $body = ['message' => 'Validation failed'];
42 4
        $body['path'] = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
43 4
        $body['validation_messages'] = $form->getFailureMessages();
44 4
        $body = $vndError ? $this->optionalAttribute($vndError) + $body : $body;
45
46 4
        return $body;
47
    }
48
49 1
    private function optionalAttribute(VndError $vndError)
50
    {
51 1
        $body = [];
52 1
        if ($vndError->message) {
53 1
            $body['message'] = $vndError->message;
54
        }
55 1
        if ($vndError->path) {
56 1
            $body['path'] = $vndError->path;
57
        }
58 1
        if ($vndError->logref) {
59 1
            $body['logref'] = $vndError->logref;
60
        }
61
62 1
        return $body;
63
    }
64
}
65