Skip to content

Commit a446290

Browse files
committed
improvements on null values in requests to ga v4
1 parent c6afc80 commit a446290

2 files changed

Lines changed: 35 additions & 32 deletions

File tree

src/Analytics.php

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,7 @@ public function getReport(GoogleAnalyticsService $googleAnalytics): AnalyticsRes
8383
{
8484
$client = $this->getClient();
8585

86-
$parameters = [
87-
'property' => 'properties/'.$this->getPropertyId(),
88-
'dateRanges' => $googleAnalytics->dateRanges,
89-
'minuteRanges' => $googleAnalytics->minuteRanges,
90-
'dimensions' => $googleAnalytics->dimensions,
91-
'metrics' => $googleAnalytics->metrics,
92-
'orderBys' => $googleAnalytics->orderBys,
93-
'metricAggregations' => $googleAnalytics->metricAggregations,
94-
'dimensionFilter' => $googleAnalytics->dimensionFilter,
95-
'metricFilter' => $googleAnalytics->metricFilter,
96-
'limit' => $googleAnalytics->limit,
97-
'offset' => $googleAnalytics->offset,
98-
'keepEmptyRows' => $googleAnalytics->keepEmptyRows,
99-
];
100-
101-
$response = $client->runReport(new RunReportRequest($parameters));
86+
$response = $client->runReport(new RunReportRequest($this->reportParameters($googleAnalytics)));
10287

10388
return $this->formatResponse($response);
10489
}
@@ -111,7 +96,22 @@ public function getRealtimeReport(GoogleAnalyticsService $googleAnalytics): Anal
11196
{
11297
$client = $this->getClient();
11398

114-
$parameters = [
99+
$response = $client->runRealtimeReport(new RunRealtimeReportRequest($this->reportParameters($googleAnalytics)));
100+
101+
return $this->formatResponse($response);
102+
}
103+
104+
/**
105+
* Build the request parameters, dropping fields that were never set. The
106+
* native protobuf extension rejects null (and empty) values that the
107+
* pure-PHP implementation silently tolerates, so unset fields must be
108+
* omitted rather than passed through as null.
109+
*
110+
* @return array<string, mixed>
111+
*/
112+
protected function reportParameters(GoogleAnalyticsService $googleAnalytics): array
113+
{
114+
return array_filter([
115115
'property' => 'properties/'.$this->getPropertyId(),
116116
'dateRanges' => $googleAnalytics->dateRanges,
117117
'minuteRanges' => $googleAnalytics->minuteRanges,
@@ -124,10 +124,6 @@ public function getRealtimeReport(GoogleAnalyticsService $googleAnalytics): Anal
124124
'limit' => $googleAnalytics->limit,
125125
'offset' => $googleAnalytics->offset,
126126
'keepEmptyRows' => $googleAnalytics->keepEmptyRows,
127-
];
128-
129-
$response = $client->runRealtimeReport(new RunRealtimeReportRequest($parameters));
130-
131-
return $this->formatResponse($response);
127+
], fn (mixed $value): bool => $value !== null && $value !== []);
132128
}
133129
}

src/Traits/Google/MinuteRangeTrait.php

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ trait MinuteRangeTrait
1111
public function setMinuteRange(?string $name, ?int $start, ?int $end): self
1212
{
1313
$this->minuteRanges = [
14-
new MinuteRange([
15-
'name' => $name,
16-
'start_minutes_ago' => $start,
17-
'end_minutes_ago' => $end,
18-
]),
14+
$this->makeMinuteRange($name, $start, $end),
1915
];
2016

2117
return $this;
@@ -26,16 +22,27 @@ public function setMinuteRanges(array ...$items): self
2622
$this->minuteRanges = [];
2723

2824
foreach ($items as $item) {
29-
$this->minuteRanges[] = new MinuteRange([
30-
'name' => $item['name'],
31-
'start_minutes_ago' => $item['start'],
32-
'end_minutes_ago' => $item['end'],
33-
]);
25+
$this->minuteRanges[] = $this->makeMinuteRange(
26+
$item['name'] ?? null,
27+
$item['start'] ?? null,
28+
$item['end'] ?? null,
29+
);
3430
}
3531

3632
return $this;
3733
}
3834

35+
private function makeMinuteRange(?string $name, ?int $start, ?int $end): MinuteRange
36+
{
37+
// The native protobuf extension rejects a null name with
38+
// "Cannot convert '' to string", so only set it when provided.
39+
return new MinuteRange(array_filter([
40+
'name' => $name,
41+
'start_minutes_ago' => $start,
42+
'end_minutes_ago' => $end,
43+
], fn (mixed $value): bool => $value !== null));
44+
}
45+
3946
private function validateStartAndEnd(?int $start, ?int $end): void
4047
{
4148
if ($start > $end) {

0 commit comments

Comments
 (0)