Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
199 lars 1
<?php namespace Clockwork\DataSource;
2
 
3
use Clockwork\DataSource\DataSource;
4
use Clockwork\Helpers\Serializer;
5
use Clockwork\Request\Log;
6
use Clockwork\Request\Request;
7
 
8
use Laravel\Lumen\Application;
9
use Symfony\Component\HttpFoundation\Response;
10
 
11
// Data source for Lumen framework, provides application log, request and response information
12
class LumenDataSource extends DataSource
13
{
14
	// Lumen application instance
15
	protected $app;
16
 
17
	// Lumen response instance
18
	protected $response;
19
 
20
	// Whether we should collect log messages
21
	protected $collectLog = true;
22
 
23
	// Whether we should collect routes
24
	protected $collectRoutes = false;
25
 
26
	// Clockwork log instance
27
	protected $log;
28
 
29
	// Create a new data source, takes Lumen application instance and additional options as arguments
30
	public function __construct(Application $app, $collectLog = true, $collectRoutes = false)
31
	{
32
		$this->app = $app;
33
 
34
		$this->collectLog    = $collectLog;
35
		$this->collectRoutes = $collectRoutes;
36
 
37
		$this->log = new Log;
38
	}
39
 
40
	// Adds request, response information, middleware, routes, session data, user and log entries to the request
41
	public function resolve(Request $request)
42
	{
43
		$request->method         = $this->getRequestMethod();
44
		$request->uri            = $this->getRequestUri();
45
		$request->controller     = $this->getController();
46
		$request->headers        = $this->getRequestHeaders();
47
		$request->responseStatus = $this->getResponseStatus();
48
		$request->routes         = $this->getRoutes();
49
		$request->sessionData    = $this->getSessionData();
50
 
51
		$this->resolveAuthenticatedUser($request);
52
 
53
		$request->log()->merge($this->log);
54
 
55
		return $request;
56
	}
57
 
58
	// Reset the data source to an empty state, clearing any collected data
59
	public function reset()
60
	{
61
		$this->log = new Log;
62
	}
63
 
64
	// Set Lumen response instance for the current request
65
	public function setResponse(Response $response)
66
	{
67
		$this->response = $response;
68
		return $this;
69
	}
70
 
71
	// Listen for the log events
72
	public function listenToEvents()
73
	{
74
		if (! $this->collectLog) return;
75
 
76
		if (class_exists(\Illuminate\Log\Events\MessageLogged::class)) {
77
			// Lumen 5.4
78
			$this->app['events']->listen(\Illuminate\Log\Events\MessageLogged::class, function ($event) {
79
				$this->log->log($event->level, $event->message, $event->context);
80
			});
81
		} else {
82
			// Lumen 5.0 to 5.3
83
			$this->app['events']->listen('illuminate.log', function ($level, $message, $context) {
84
				$this->log->log($level, $message, $context);
85
			});
86
		}
87
	}
88
 
89
	// Get a textual representation of current route's controller
90
	protected function getController()
91
	{
92
		$routes = method_exists($this->app, 'getRoutes') ? $this->app->getRoutes() : [];
93
 
94
		$method = $this->getRequestMethod();
95
		$pathInfo = $this->getPathInfo();
96
 
97
		if (isset($routes[$method.$pathInfo]['action']['uses'])) {
98
			$controller = $routes[$method.$pathInfo]['action']['uses'];
99
		} elseif (isset($routes[$method.$pathInfo]['action'][0])) {
100
			$controller = $routes[$method.$pathInfo]['action'][0];
101
		} else {
102
			$controller = null;
103
		}
104
 
105
		if ($controller instanceof \Closure) {
106
			$controller = 'anonymous function';
107
		} elseif (is_object($controller)) {
108
			$controller = 'instance of ' . get_class($controller);
109
		} elseif (! is_string($controller)) {
110
			$controller = null;
111
		}
112
 
113
		return $controller;
114
	}
115
 
116
	// Get the request headers
117
	protected function getRequestHeaders()
118
	{
119
		return $this->app['request']->headers->all();
120
	}
121
 
122
	// Get the request method
123
	protected function getRequestMethod()
124
	{
125
		if ($this->app->bound('request')) {
126
			return $this->app['request']->getMethod();
127
		} elseif (isset($_POST['_method'])) {
128
			return strtoupper($_POST['_method']);
129
		} else {
130
			return $_SERVER['REQUEST_METHOD'];
131
		}
132
	}
133
 
134
	// Get the request URI
135
	protected function getRequestUri()
136
	{
137
		return $this->app['request']->getRequestUri();
138
	}
139
 
140
	// Get the response status code
141
	protected function getResponseStatus()
142
	{
143
		return $this->response ? $this->response->getStatusCode() : null;
144
	}
145
 
146
	// Get an array of application routes
147
	protected function getRoutes()
148
	{
149
		if (! $this->collectRoutes) return [];
150
 
151
		if (isset($this->app->router)) {
152
			$routes = array_values($this->app->router->getRoutes());
153
		} elseif (method_exists($this->app, 'getRoutes')) {
154
			$routes = array_values($this->app->getRoutes());
155
		} else {
156
			$routes = [];
157
		}
158
 
159
		return array_map(function ($route) {
160
			return [
161
				'method' => $route['method'],
162
				'uri'    => $route['uri'],
163
				'name'   => isset($route['action']['as']) ? $route['action']['as'] : null,
164
				'action' => isset($route['action']['uses']) && is_string($route['action']['uses']) ? $route['action']['uses'] : 'anonymous function',
165
				'middleware' => isset($route['action']['middleware']) ? $route['action']['middleware'] : null,
166
			];
167
		}, $routes);
168
	}
169
 
170
	// Get the session data (normalized with passwords removed)
171
	protected function getSessionData()
172
	{
173
		if (! isset($this->app['session'])) return [];
174
 
175
		return $this->removePasswords((new Serializer)->normalizeEach($this->app['session']->all()));
176
	}
177
 
178
	// Add authenticated user data to the request
179
	protected function resolveAuthenticatedUser(Request $request)
180
	{
181
		if (! isset($this->app['auth'])) return;
182
		if (! ($user = $this->app['auth']->user())) return;
183
		if (! isset($user->email) || ! isset($user->id)) return;
184
 
185
		$request->setAuthenticatedUser($user->email, $user->id, [
186
			'email' => $user->email,
187
			'name'  => isset($user->name) ? $user->name : null
188
		]);
189
	}
190
 
191
	// Get the request path info
192
	protected function getPathInfo()
193
	{
194
		if ($this->app->bound('request')) {
195
			return $this->app['request']->getPathInfo();
196
		} else {
197
			$query = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';
198
			return '/' . trim(str_replace("?{$query}", '', $_SERVER['REQUEST_URI']), '/');
199
		}
200
	}
201
}