Skip to content

Commit e210d6b

Browse files
committed
Add PHPStan
1 parent b4d1134 commit e210d6b

File tree

7 files changed

+156
-60
lines changed

7 files changed

+156
-60
lines changed

.github/workflows/phpstan.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: PHPStan
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- "**.php"
7+
- "phpstan.neon.dist"
8+
push:
9+
branches:
10+
- main
11+
12+
jobs:
13+
phpstan:
14+
name: phpstan
15+
runs-on: ubuntu-latest
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- name: Setup PHP
20+
uses: shivammathur/setup-php@v2
21+
with:
22+
php-version: "8.2"
23+
coverage: none
24+
25+
- name: Install composer dependencies
26+
uses: ramsey/composer-install@v3
27+
28+
- name: Run PHPStan
29+
run: ./vendor/bin/phpstan analyse --error-format=github --debug

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"require-dev": {
2323
"friendsofphp/php-cs-fixer": "^3.0",
2424
"pestphp/pest": "^1.20",
25+
"phpstan/phpstan": "^1.12",
2526
"spatie/ray": "^1.28"
2627
},
2728
"autoload": {

phpstan.neon.dist

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
parameters:
2+
level: 8
3+
paths:
4+
- src
5+
tmpDir: build/phpstan
6+
parallel:
7+
maximumNumberOfProcesses: 1

src/Client.php

Lines changed: 81 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,137 +2,174 @@
22

33
namespace Vormkracht10\KvKApi;
44

5+
use GuzzleHttp\ClientInterface;
6+
use GuzzleHttp\Psr7\Response;
57
use Illuminate\Support\Collection;
8+
use Psr\Http\Message\ResponseInterface;
9+
use stdClass;
610
use Vormkracht10\KvKApi\Company\Company;
711

812
class Client
913
{
10-
private $httpClient;
11-
private $baseUrl;
12-
private array $results;
13-
private int $page;
14-
private int $resultsPerPage;
15-
16-
public function __construct($httpClient)
14+
private ClientInterface $httpClient;
15+
private string $baseUrl;
16+
/** @var array<Company> */
17+
private array $results = [];
18+
private int $page = 1;
19+
private int $resultsPerPage = 10;
20+
21+
public function __construct(ClientInterface $httpClient)
1722
{
1823
$this->httpClient = $httpClient;
1924
$this->baseUrl = 'https://api.kvk.nl/api/v2/';
2025
}
2126

22-
public function search(string $search, array $params = [])
27+
/**
28+
* @param array<string, mixed> $params
29+
* @return array<Company>
30+
*/
31+
public function search(string $search, array $params = []): array
2332
{
2433
$queryParams = array_merge([
2534
'naam' => $search,
26-
'pagina' => $this->page ?? 1,
27-
'resultatenPerPagina' => $this->resultsPerPage ?? 10,
35+
'pagina' => $this->page,
36+
'resultatenPerPagina' => $this->resultsPerPage,
2837
], $params);
2938
$data = $this->getData($queryParams);
3039

3140
$parsedData = $this->parseData($this->decodeJson($data));
3241

33-
$parsedData->each(function ($item) {
34-
$data = json_decode($this->getRelatedData($item));
42+
foreach ($parsedData as $item) {
43+
$data = $this->decodeJson($this->getRelatedData($item));
3544

3645
$this->results[] = new Company(
37-
$data->kvkNummer ?? null,
46+
$data->kvkNummer ?? '',
3847
$data->vestigingsnummer ?? null,
3948
$data->naam ?? null,
4049
$data->adres ?? null,
4150
$data->websites ?? null
4251
);
43-
});
52+
};
4453

4554
return $this->results;
4655
}
4756

48-
private function getData(array $params)
57+
/**
58+
* @param array<string, mixed> $params
59+
*/
60+
private function getData(array $params): string
4961
{
5062
$url = $this->baseUrl . 'zoeken?' . http_build_query($params);
5163

52-
$response = $this->httpClient->get($url);
64+
$response = $this->httpClient->request('GET', $url);
5365

5466
return $this->getJson($response);
5567
}
5668

57-
private function getJson(object $response)
69+
private function getJson(ResponseInterface $response): string
5870
{
59-
return $response->getBody()->getContents();
71+
return (string) $response->getBody()->getContents();
6072
}
6173

62-
private function decodeJson(string $json)
74+
/**
75+
* @return stdClass
76+
*/
77+
private function decodeJson(string $json): stdClass
6378
{
64-
return json_decode($json);
79+
return json_decode($json, false) ?: new stdClass();
6580
}
6681

67-
public function setPage(int $page)
82+
public function setPage(int $page): self
6883
{
6984
$this->page = $page;
7085

7186
return $this;
7287
}
7388

74-
public function setResultsPerPage(int $resultsPerPage)
89+
public function setResultsPerPage(int $resultsPerPage): self
7590
{
7691
$this->resultsPerPage = $resultsPerPage;
7792

7893
return $this;
7994
}
8095

81-
public function searchByKvkNumber(string $kvkNumber, array $params = [])
96+
/**
97+
* @param array<string, mixed> $params
98+
* @return array<Company>
99+
*/
100+
public function searchByKvkNumber(string $kvkNumber, array $params = []): array
82101
{
83102
return $this->search('', array_merge(['kvkNummer' => $kvkNumber], $params));
84103
}
85104

86-
public function searchByRsin(string $rsin, array $params = [])
105+
/**
106+
* @param array<string, mixed> $params
107+
* @return array<Company>
108+
*/
109+
public function searchByRsin(string $rsin, array $params = []): array
87110
{
88111
return $this->search('', array_merge(['rsin' => $rsin], $params));
89112
}
90113

91-
public function searchByVestigingsnummer(string $vestigingsnummer, array $params = [])
114+
/**
115+
* @param array<string, mixed> $params
116+
* @return array<Company>
117+
*/
118+
public function searchByVestigingsnummer(string $vestigingsnummer, array $params = []): array
92119
{
93120
return $this->search('', array_merge(['vestigingsnummer' => $vestigingsnummer], $params));
94121
}
95122

96-
private function parseData(object $data)
123+
/**
124+
* @return array<int, stdClass>
125+
*/
126+
private function parseData(stdClass $data): array
97127
{
98-
$data = collect($data->resultaten);
128+
$resultaten = $data->resultaten ?? [];
129+
/** @var array<int, stdClass> $resultatenArray */
130+
$resultatenArray = is_array($resultaten) ? $resultaten : [];
99131

100-
$data = $data->map(function ($value) {
132+
return array_map(function ($value) {
101133
$value = (object) $value;
102-
$value->attributes = collect((array) $value)->except(['type', 'links']);
134+
/** @var array<string, mixed> $attributes */
135+
$attributes = array_diff_key((array) $value, array_flip(['type', 'links']));
136+
$value->attributes = $attributes;
103137
$value->id = uniqid();
104138

105139
if (isset($value->links)) {
106-
$links = collect($value->links);
107-
$links = $links->mapWithKeys(function ($linkObj) {
108-
return [$linkObj->rel => $linkObj->href];
109-
});
110-
$value->links = $links;
140+
/** @var array<stdClass> $links */
141+
$links = $value->links;
142+
/** @var array<string, string> $mappedLinks */
143+
$mappedLinks = array_column($links, 'href', 'rel');
144+
$value->links = $mappedLinks;
111145
} else {
112-
$value->links = collect();
146+
/** @var array<string, string> $emptyLinks */
147+
$emptyLinks = [];
148+
$value->links = $emptyLinks;
113149
}
114150

115151
$value->actief = $value->actief ?? null;
116152
$value->vervallenNaam = $value->vervallenNaam ?? null;
117153

118154
return $value;
119-
});
120-
121-
return $data;
155+
}, $resultatenArray);
122156
}
123157

124-
private function getRelatedData($parsedData): Collection
158+
private function getRelatedData(stdClass $parsedData): string
125159
{
126-
$relatedData = collect();
160+
$relatedData = [];
161+
162+
/** @var Collection<string, string> $links */
163+
$links = collect((array)($parsedData->links ?? []));
127164

128-
collect($parsedData->links)->each(function ($link, $key) use (&$relatedData) {
129-
$response = $this->httpClient->get($link);
165+
$links->each(function (string $link) use (&$relatedData) {
166+
$response = $this->httpClient->request('GET', $link);
130167

131168
$data = $this->decodeJson($this->getJson($response));
132169

133-
$relatedData = $relatedData->merge($data);
170+
$relatedData = array_merge($relatedData, (array) $data);
134171
});
135172

136-
return $relatedData;
173+
return json_encode($relatedData) ?: '{}';
137174
}
138175
}

src/ClientFactory.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static function create(string $apiKey, ?string $rootCertificate = null):
1717
private static function createHttpClient(
1818
string $apiKey,
1919
?string $rootCertificate = null
20-
) {
20+
): Client {
2121
if ($rootCertificate === null) {
2222
return new Client([
2323
'headers' => [
@@ -33,4 +33,4 @@ private static function createHttpClient(
3333
'verify' => $rootCertificate,
3434
]);
3535
}
36-
}
36+
}

src/Company/Address.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@
44

55
class Address
66
{
7+
private string $type;
8+
private ?string $street;
9+
private ?int $houseNumber;
10+
private string $postalCode;
11+
private string $city;
12+
private string $country;
13+
714
public function __construct(
815
string $type,
916
?string $street,
@@ -50,6 +57,9 @@ public function getCountry(): string
5057
return $this->country;
5158
}
5259

60+
/**
61+
* @return array<string, string|int|null>
62+
*/
5363
public function get(): array
5464
{
5565
return [
@@ -61,4 +71,4 @@ public function get(): array
6171
'country' => $this->country,
6272
];
6373
}
64-
}
74+
}

src/Company/Company.php

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44

55
class Company
66
{
7-
private $kvkNumber;
8-
9-
private $establishmentNumber;
10-
11-
private $tradeName;
12-
13-
private $addresses;
14-
15-
private $websites;
7+
private string $kvkNumber;
8+
private ?string $establishmentNumber;
9+
private ?string $tradeName;
10+
/** @var array<mixed>|null */
11+
private ?array $addresses;
12+
/** @var array<string>|null */
13+
private ?array $websites;
1614

15+
/**
16+
* @param array<mixed>|null $addresses
17+
* @param array<string>|null $websites
18+
*/
1719
public function __construct(
1820
string $kvkNumber,
1921
?string $establishmentNumber,
@@ -33,7 +35,7 @@ public function getKvkNumber(): string
3335
return $this->kvkNumber;
3436
}
3537

36-
public function getEstablishmentNumber(): string
38+
public function getEstablishmentNumber(): ?string
3739
{
3840
return $this->establishmentNumber;
3941
}
@@ -44,10 +46,14 @@ public function getTradeName(): ?string
4446
}
4547

4648
/**
47-
* @return Address[]
49+
* @return array<Address>|null
4850
*/
4951
public function getAddresses(): ?array
5052
{
53+
if ($this->addresses === null) {
54+
return null;
55+
}
56+
5157
$addresses = [];
5258

5359
foreach ($this->addresses as $address) {
@@ -64,11 +70,17 @@ public function getAddresses(): ?array
6470
return $addresses;
6571
}
6672

67-
public function getWebsites(): array
73+
/**
74+
* @return array<string>|null
75+
*/
76+
public function getWebsites(): ?array
6877
{
6978
return $this->websites;
7079
}
7180

81+
/**
82+
* @return array<string, mixed>
83+
*/
7284
public function get(): array
7385
{
7486
return [
@@ -79,4 +91,4 @@ public function get(): array
7991
'websites' => $this->websites,
8092
];
8193
}
82-
}
94+
}

0 commit comments

Comments
 (0)