addDays(self::VALID_DAYS), [ 't' => Crypt::encryptString((string) json_encode([ 'e' => mb_strtolower(trim($email)), 'p' => $pressRelease->getKey(), ])), 'src' => $source->value, 'pr' => $pressRelease->getKey(), ]); } /** * @return array{email: string, press_release_id: int}|null */ public function decode(?string $token): ?array { if (blank($token)) { return null; } try { $data = json_decode(Crypt::decryptString((string) $token), true); } catch (DecryptException) { return null; } if (! is_array($data) || ! is_string($data['e'] ?? null) || ! filter_var($data['e'], FILTER_VALIDATE_EMAIL) || (int) ($data['p'] ?? 0) <= 0) { return null; } return ['email' => $data['e'], 'press_release_id' => (int) $data['p']]; } }