Symfony::getTarget()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2014-2025
6
 * @package MW
7
 * @subpackage View
8
 */
9
10
11
namespace Aimeos\Base\View\Helper\Request;
12
13
14
/**
15
 * View helper class for retrieving data from Symfony requests.
16
 *
17
 * @package MW
18
 * @subpackage View
19
 */
20
class Symfony
21
	extends \Aimeos\Base\View\Helper\Request\Standard
22
	implements \Aimeos\Base\View\Helper\Request\Iface
23
{
24
	private \Symfony\Component\HttpFoundation\Request $request;
25
26
27
	/**
28
	 * Initializes the URL view helper.
29
	 *
30
	 * @param \Aimeos\Base\View\Iface $view View instance with registered view helpers
31
	 * @param \Symfony\Component\HttpFoundation\Request $request Symfony request object
32
	 */
33
	public function __construct( $view, \Symfony\Component\HttpFoundation\Request $request )
34
	{
35
		$this->request = $request;
36
37
		parent::__construct( $view, $this->createRequest( $request ) );
38
	}
39
40
41
	/**
42
	 * Returns the client IP address.
43
	 *
44
	 * @return string Client IP address
45
	 */
46
	public function getClientAddress() : string
47
	{
48
		return $this->request->getClientIp();
49
	}
50
51
52
	/**
53
	 * Returns the current page or route name
54
	 *
55
	 * @return string|null Current page or route name
56
	 */
57
	public function getTarget() : ?string
58
	{
59
		return $this->request->get( '_route' );
60
	}
61
62
63
	/**
64
	 * Transforms a Symfony request into a PSR-7 request object
65
	 *
66
	 * @param \Symfony\Component\HttpFoundation\Request $nativeRequest Symfony request object
67
	 * @return \Psr\Http\Message\ServerRequestInterface PSR-7 request object
68
	 */
69
	protected function createRequest( \Symfony\Component\HttpFoundation\Request $nativeRequest ) : \Psr\Http\Message\ServerRequestInterface
70
	{
71
		$files = $this->getFiles( $nativeRequest->files->all() );
72
		$headers = $nativeRequest->headers->all();
73
		$server = $nativeRequest->server->all();
74
		$method = $nativeRequest->getMethod();
75
		$uri = $nativeRequest->getUri();
76
77
		$request = new \Nyholm\Psr7\ServerRequest( $method, $uri, $headers, $nativeRequest->getContent(), '1.1', $server );
78
		$request = $request->withCookieParams( $nativeRequest->cookies->all() )
79
			->withParsedBody( $nativeRequest->request->all() )
80
			->withQueryParams( $nativeRequest->query->all() )
81
			->withUploadedFiles( $files );
82
83
		foreach( $nativeRequest->attributes->all() as $key => $value ) {
84
			$request = $request->withAttribute( $key, $value );
85
		}
86
87
		return $request;
88
	}
89
90
91
	/**
92
	 * Converts Symfony uploaded files array to the PSR-7 one.
93
	 *
94
	 * @param array $files Multi-dimensional list of uploaded files from Symfony request
95
	 * @return array Multi-dimensional list of uploaded files as PSR-7 objects
96
	 */
97
	protected function getFiles( array $files ) : array
98
	{
99
		$list = [];
100
		$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
101
102
		foreach( $files as $key => $value )
103
		{
104
			if( $value instanceof \Symfony\Component\HttpFoundation\File\UploadedFile )
105
			{
106
				$list[$key] = $psr17Factory->createUploadedFile(
107
					$psr17Factory->createStreamFromFile( $value->getRealPath() ),
108
					$value->getSize(),
109
					$value->getError(),
110
					$value->getClientOriginalName(),
111
					$value->getClientMimeType()
112
				);
113
			}
114
			elseif( is_array( $value ) )
115
			{
116
				$list[$key] = $this->getFiles( $value );
117
			}
118
		}
119
120
		return $list;
121
	}
122
}
123