Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * @see http://github.com/zendframework/zend-diactoros for the canonical source repository
|
Chris@0
|
4 * @copyright Copyright (c) 2017 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
5 * @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
|
Chris@0
|
6 */
|
Chris@0
|
7
|
Chris@0
|
8 namespace Zend\Diactoros\Request;
|
Chris@0
|
9
|
Chris@0
|
10 use Psr\Http\Message\RequestInterface;
|
Chris@0
|
11 use UnexpectedValueException;
|
Chris@0
|
12 use Zend\Diactoros\Request;
|
Chris@0
|
13 use Zend\Diactoros\Stream;
|
Chris@0
|
14
|
Chris@16
|
15 use function sprintf;
|
Chris@16
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Serialize or deserialize request messages to/from arrays.
|
Chris@0
|
19 *
|
Chris@0
|
20 * This class provides functionality for serializing a RequestInterface instance
|
Chris@0
|
21 * to an array, as well as the reverse operation of creating a Request instance
|
Chris@0
|
22 * from an array representing a message.
|
Chris@0
|
23 */
|
Chris@0
|
24 final class ArraySerializer
|
Chris@0
|
25 {
|
Chris@0
|
26 /**
|
Chris@0
|
27 * Serialize a request message to an array.
|
Chris@0
|
28 *
|
Chris@0
|
29 * @param RequestInterface $request
|
Chris@0
|
30 * @return array
|
Chris@0
|
31 */
|
Chris@0
|
32 public static function toArray(RequestInterface $request)
|
Chris@0
|
33 {
|
Chris@0
|
34 return [
|
Chris@0
|
35 'method' => $request->getMethod(),
|
Chris@0
|
36 'request_target' => $request->getRequestTarget(),
|
Chris@0
|
37 'uri' => (string) $request->getUri(),
|
Chris@0
|
38 'protocol_version' => $request->getProtocolVersion(),
|
Chris@0
|
39 'headers' => $request->getHeaders(),
|
Chris@0
|
40 'body' => (string) $request->getBody(),
|
Chris@0
|
41 ];
|
Chris@0
|
42 }
|
Chris@0
|
43
|
Chris@0
|
44 /**
|
Chris@0
|
45 * Deserialize a request array to a request instance.
|
Chris@0
|
46 *
|
Chris@0
|
47 * @param array $serializedRequest
|
Chris@0
|
48 * @return Request
|
Chris@0
|
49 * @throws UnexpectedValueException when cannot deserialize response
|
Chris@0
|
50 */
|
Chris@0
|
51 public static function fromArray(array $serializedRequest)
|
Chris@0
|
52 {
|
Chris@0
|
53 try {
|
Chris@0
|
54 $uri = self::getValueFromKey($serializedRequest, 'uri');
|
Chris@0
|
55 $method = self::getValueFromKey($serializedRequest, 'method');
|
Chris@0
|
56 $body = new Stream('php://memory', 'wb+');
|
Chris@0
|
57 $body->write(self::getValueFromKey($serializedRequest, 'body'));
|
Chris@0
|
58 $headers = self::getValueFromKey($serializedRequest, 'headers');
|
Chris@0
|
59 $requestTarget = self::getValueFromKey($serializedRequest, 'request_target');
|
Chris@0
|
60 $protocolVersion = self::getValueFromKey($serializedRequest, 'protocol_version');
|
Chris@0
|
61
|
Chris@0
|
62 return (new Request($uri, $method, $body, $headers))
|
Chris@0
|
63 ->withRequestTarget($requestTarget)
|
Chris@0
|
64 ->withProtocolVersion($protocolVersion);
|
Chris@0
|
65 } catch (\Exception $exception) {
|
Chris@0
|
66 throw new UnexpectedValueException('Cannot deserialize request', null, $exception);
|
Chris@0
|
67 }
|
Chris@0
|
68 }
|
Chris@0
|
69
|
Chris@0
|
70 /**
|
Chris@0
|
71 * @param array $data
|
Chris@0
|
72 * @param string $key
|
Chris@0
|
73 * @param string $message
|
Chris@0
|
74 * @return mixed
|
Chris@0
|
75 * @throws UnexpectedValueException
|
Chris@0
|
76 */
|
Chris@0
|
77 private static function getValueFromKey(array $data, $key, $message = null)
|
Chris@0
|
78 {
|
Chris@0
|
79 if (isset($data[$key])) {
|
Chris@0
|
80 return $data[$key];
|
Chris@0
|
81 }
|
Chris@0
|
82 if ($message === null) {
|
Chris@0
|
83 $message = sprintf('Missing "%s" key in serialized request', $key);
|
Chris@0
|
84 }
|
Chris@0
|
85 throw new UnexpectedValueException($message);
|
Chris@0
|
86 }
|
Chris@0
|
87 }
|