date = new \DateTime(); } public function getReferer(): string { return $this->referer; } public function setReferer(string $referer): self { $this->referer = $referer; return $this; } public function getDate(): \DateTime { return $this->date; } public function setDate(\DateTime $date): self { $this->date = $date; return $this; } public function getShortUrl(): ShortUrl { return $this->shortUrl; } public function setShortUrl(ShortUrl $shortUrl): self { $this->shortUrl = $shortUrl; return $this; } public function getRemoteAddr(): string { return $this->remoteAddr; } public function setRemoteAddr(?string $remoteAddr): self { $this->remoteAddr = $this->obfuscateAddress($remoteAddr); $this->remoteAddrHash = $this->hashAddress($remoteAddr); return $this; } private function obfuscateAddress(?string $address): ?string { // Localhost addresses do not need to be obfuscated if ($address === null || $address === IpAddress::LOCALHOST) { return $address; } try { return (string) IpAddress::fromString($address)->getObfuscatedCopy(); } catch (WrongIpException $e) { return null; } } private function hashAddress(?string $address): ?string { return $address ? \hash('sha256', $address) : null; } public function resetObfuscatedAddr(): self { $this->remoteAddr = null; return $this; } public function getUserAgent(): string { return $this->userAgent; } public function setUserAgent(string $userAgent): self { $this->userAgent = $userAgent; return $this; } public function getVisitLocation(): VisitLocation { return $this->visitLocation; } public function setVisitLocation(VisitLocation $visitLocation): self { $this->visitLocation = $visitLocation; return $this; } /** * Specify data which should be serialized to JSON * @link http://php.net/manual/en/jsonserializable.jsonserialize.php * @return array data which can be serialized by json_encode, * which is a value of any type other than a resource. * @since 5.4.0 */ public function jsonSerialize(): array { return [ 'referer' => $this->referer, 'date' => isset($this->date) ? $this->date->format(\DateTime::ATOM) : null, 'remoteAddr' => $this->remoteAddr, 'userAgent' => $this->userAgent, 'visitLocation' => $this->visitLocation, ]; } }