Completed
Push — develop ( fb325c...cc134c )
by jake
02:26
created

AbstractResponderLocator::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * Vperyod\AcceptHandler
4
 *
5
 * PHP version 5
6
 *
7
 * Copyright (C) 2016 Jake Johns
8
 *
9
 * This software may be modified and distributed under the terms
10
 * of the MIT license.  See the LICENSE file for details.
11
 *
12
 * @category  Responder
13
 * @package   Vperyod\AcceptHandler
14
 * @author    Jake Johns <[email protected]>
15
 * @copyright 2016 Jake Johns
16
 * @license   http://jnj.mit-license.org/2016 MIT License
17
 * @link      https://github.com/vperyod/vperyod.accept-handler
18
 */
19
20
namespace Vperyod\AcceptHandler\Responder;
21
22
use Vperyod\AcceptHandler\Exception;
23
24
use Psr\Http\Message\ResponseInterface as Response;
25
use Psr\Http\Message\ServerRequestInterface as Request;
26
27
/**
28
 * ResponderLocator
29
 *
30
 * @category Responder
31
 * @package  Vperyod\AcceptHandler
32
 * @author   Jake Johns <[email protected]>
33
 * @license  http://jnj.mit-license.org/ MIT License
34
 * @link     https://github.com/vperyod/vperyod.accept-handler
35
 *
36
 * @abstract
37
 */
38
abstract class AbstractResponderLocator
39
{
40
    /**
41
     * Responder factories
42
     *
43
     * @var array
44
     *
45
     * @access protected
46
     */
47
    protected $factories = [];
48
49
    /**
50
     * Create a responder locator
51
     *
52
     * @param array $factories factories to create responders
53
     *
54
     * @access public
55
     */
56 5
    public function __construct(array $factories)
57
    {
58 5
        $this->factories = $factories;
59 5
    }
60
61
    /**
62
     * Negotiate and respond
63
     *
64
     * @param Request          $request  PSR7 Request
65
     * @param Response         $response PSR7 Response
66
     * @param PayloadInterface $payload  Domain Payload
67
     *
68
     * @return Response
69
     *
70
     * @access public
71
     */
72 4
    public function __invoke(
73
        Request $request,
74
        Response $response,
75
        $payload = null
76
    ) {
77 4
        $this->request = $request;
0 ignored issues
show
Bug introduced by
The property request does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
78 4
        $this->response = $response;
0 ignored issues
show
Bug introduced by
The property response does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
79 4
        $this->payload = $payload;
0 ignored issues
show
Bug introduced by
The property payload does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
80
81 4
        $type = $this->negotiate($request);
82
83 4
        if (! $type || ! $this->has($type)) {
84 1
            return $this->notAcceptable();
85
        }
86
87 3
        $responder = $this->get($type);
88
89 3
        return $responder($request, $response, $payload);
90
    }
91
92
    /**
93
     * Accepts
94
     *
95
     * @return array
96
     *
97
     * @access public
98
     */
99 2
    public function accepts()
100
    {
101 2
        return array_keys($this->factories);
102
    }
103
104
    /**
105
     * Unavailable
106
     *
107
     * @return Response
108
     *
109
     * @access protected
110
     */
111 1
    protected function notAcceptable()
112
    {
113 1
        $this->response = $this->response->withStatus(406)
114 1
            ->withHeader('Content-Type', 'application/json');
115 1
        $this->response->getBody()->write(json_encode($this->accepts()));
116 1
        return $this->response;
117
    }
118
119
    /**
120
     * Set
121
     *
122
     * @param string  $name     name/type of responder
123
     * @param calable $callable factory
124
     *
125
     * @return $this
126
     *
127
     * @access public
128
     */
129 1
    public function set($name, callable $callable)
130
    {
131 1
        $this->factories[$name] = $callable;
132 1
        return $this;
133
    }
134
    /**
135
     * Does a named helper exist?
136
     *
137
     * @param string $name The responder name.
138
     *
139
     * @return bool
140
     */
141 5
    public function has($name)
142
    {
143 5
        return isset($this->factories[$name]);
144
    }
145
146
    /**
147
     * Get a responder
148
     *
149
     * @param string $name The responder to retrieve.
150
     *
151
     * @return object
152
     */
153 4
    public function get($name)
154
    {
155 4
        if (! $this->has($name)) {
156 1
            throw new Exception\ResponderNotFoundException(
157
                'Responder not found for: ' . $name
158 1
            );
159
        }
160
161 3
        $factory = $this->factories[$name];
162 3
        return $factory();
163
    }
164
165
    /**
166
     * Negotiate
167
     *
168
     * @param Request $request PSR7 Request
169
     *
170
     * @return string | false
171
     *
172
     * @access protected
173
     */
174
    abstract protected function negotiate(Request $request);
175
}
176