public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
{
if (!self::hasAttribute($request, ClientIp::KEY)) {
throw new RuntimeException('Geolocate middleware needs ClientIp executed before');
}
$ip = ClientIp::getIp($request);
if ($ip !== null) {
if ($this->saveInSession) {
$ips =& self::getStorage($request, self::KEY);
if (isset($ips[$ip])) {
$address = new AddressCollection($ips[$ip]);
} else {
$address = $this->geocoder->geocode($ip);
$ips[$ip] = $address->all();
}
} else {
$address = $this->geocoder->geocode($ip);
}
$request = self::setAttribute($request, self::KEY, $address);
}
return $next($request, $response);
}