Skip to content

Commit c0aa53b

Browse files
authored
Merge pull request #564 from armanist/issue/563-http-client-request-factory
Issue/563 http client request factory
2 parents af03b2e + 34b554c commit c0aa53b

10 files changed

Lines changed: 124 additions & 91 deletions

File tree

src/HttpClient/Adapters/CurlAdapter.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,9 @@ public function buildPostData($data)
8282
return $this->client->buildPostData($data);
8383
}
8484

85-
/**
86-
* @return mixed
87-
*/
88-
public function start()
85+
public function start(): void
8986
{
90-
return $this->client->exec();
87+
$this->client->exec();
9188
}
9289

9390
/**

src/HttpClient/Adapters/MultiCurlAdapter.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,9 @@ public function error(callable $callback): MultiCurlAdapterInterface
5454
return $this;
5555
}
5656

57-
/**
58-
* @return mixed
59-
*/
60-
public function start()
57+
public function start(): void
6158
{
62-
return $this->client->start();
59+
$this->client->start();
6360
}
6461

6562
/**

src/HttpClient/Contracts/HttpClientAdapterInterface.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ interface HttpClientAdapterInterface
1818
{
1919
/**
2020
* Starts request execution
21-
* @return mixed
2221
*/
23-
public function start();
22+
public function start(): void;
2423

2524
/**
2625
* Sets request header

src/HttpClient/Enums/HttpClientType.php

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/HttpClient/Factories/HttpClientFactory.php

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,26 @@
1010

1111
namespace Quantum\HttpClient\Factories;
1212

13-
use Quantum\App\Exceptions\BaseException;
14-
use Quantum\Di\Exceptions\DiException;
1513
use Quantum\HttpClient\HttpClient;
16-
use Quantum\Di\Di;
17-
use ReflectionException;
1814

1915
/**
2016
* Class HttpClientFactory
2117
* @package Quantum\HttpClient
2218
*/
2319
class HttpClientFactory
2420
{
25-
private ?HttpClient $instance = null;
26-
27-
/**
28-
* @throws DiException|BaseException|ReflectionException
29-
*/
30-
public static function get(): HttpClient
21+
public static function createRequest(string $url): HttpClient
3122
{
32-
if (!Di::isRegistered(self::class)) {
33-
Di::register(self::class);
34-
}
35-
36-
return Di::get(self::class)->resolve();
23+
return (new HttpClient())->createRequest($url);
3724
}
3825

39-
public function resolve(): HttpClient
26+
public static function createMultiRequest(): HttpClient
4027
{
41-
if (!$this->instance) {
42-
$this->instance = $this->createInstance();
43-
}
44-
45-
return $this->instance;
28+
return (new HttpClient())->createMultiRequest();
4629
}
4730

48-
private function createInstance(): HttpClient
31+
public static function createAsyncMultiRequest(callable $success, callable $error): HttpClient
4932
{
50-
return new HttpClient();
33+
return (new HttpClient())->createAsyncMultiRequest($success, $error);
5134
}
5235
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
/**
4+
* Quantum PHP Framework
5+
* An open-source software development framework for PHP
6+
* @link https://quantumphp.io
7+
*/
8+
9+
use Quantum\HttpClient\Factories\HttpClientFactory;
10+
use Quantum\HttpClient\HttpClient;
11+
12+
/**
13+
* Creates single HTTP request client
14+
*/
15+
function httpRequest(string $url): HttpClient
16+
{
17+
return HttpClientFactory::createRequest($url);
18+
}
19+
20+
/**
21+
* Creates multi HTTP request client
22+
*/
23+
function httpMultiRequest(): HttpClient
24+
{
25+
return HttpClientFactory::createMultiRequest();
26+
}
27+
28+
/**
29+
* Creates async multi HTTP request client
30+
*/
31+
function httpAsyncMultiRequest(callable $success, callable $error): HttpClient
32+
{
33+
return HttpClientFactory::createAsyncMultiRequest($success, $error);
34+
}

tests/Unit/HttpClient/Adapters/CurlAdapterTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public function testCurlAdapterDelegatesRequestMethods(): void
3636
$this->assertSame($adapter, $adapter->setOpt(CURLOPT_TIMEOUT, 10));
3737
$this->assertSame($adapter, $adapter->setOpts([CURLOPT_CONNECTTIMEOUT => 5]));
3838
$this->assertSame('a=1', $adapter->buildPostData(['a' => 1]));
39-
$this->assertSame('ok', $adapter->start());
39+
40+
$adapter->start();
4041
}
4142

4243
public function testCurlAdapterDelegatesResponseMethods(): void

tests/Unit/HttpClient/Adapters/MultiCurlAdapterTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public function testMultiCurlAdapterDelegatesRequestMethods(): void
4040
$this->assertSame($adapter, $adapter->setOpts([CURLOPT_CONNECTTIMEOUT => 5]));
4141
$this->assertInstanceOf(CurlAdapter::class, $adapter->addGet('https://example.com', ['a' => 1]));
4242
$this->assertInstanceOf(CurlAdapter::class, $adapter->addPost('https://example.com', 'payload', true));
43-
$this->assertNull($adapter->start());
43+
44+
$adapter->start();
4445
}
4546

4647
public function testMultiCurlAdapterRegistersCallbacks(): void

tests/Unit/HttpClient/Factories/HttpClientFactoryTest.php

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,48 @@
33
namespace Quantum\Tests\Unit\HttpClient\Factories;
44

55
use Quantum\HttpClient\Factories\HttpClientFactory;
6+
use Quantum\HttpClient\Adapters\MultiCurlAdapter;
7+
use Quantum\HttpClient\Adapters\CurlAdapter;
68
use Quantum\Tests\Unit\AppTestCase;
79
use Quantum\HttpClient\HttpClient;
8-
use Quantum\Di\Di;
910

1011
class HttpClientFactoryTest extends AppTestCase
1112
{
12-
public function setUp(): void
13+
public function testHttpClientFactoryCreatesSingleRequest(): void
1314
{
14-
parent::setUp();
15+
$httpClient1 = HttpClientFactory::createRequest('https://example.com');
16+
$httpClient2 = HttpClientFactory::createRequest('https://example.org');
1517

16-
$this->resetHttpClientFactory();
18+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
19+
$this->assertInstanceOf(CurlAdapter::class, $httpClient1->getAdapter());
20+
$this->assertNotSame($httpClient1, $httpClient2);
1721
}
1822

19-
public function testHttpClientFactoryInstance(): void
23+
public function testHttpClientFactoryCreatesMultiRequest(): void
2024
{
21-
$this->assertInstanceOf(HttpClient::class, HttpClientFactory::get());
22-
}
23-
24-
public function testHttpClientFactoryReturnsSameInstance(): void
25-
{
26-
$httpClient1 = HttpClientFactory::get();
27-
$httpClient2 = HttpClientFactory::get();
25+
$httpClient1 = HttpClientFactory::createMultiRequest();
26+
$httpClient2 = HttpClientFactory::createMultiRequest();
2827

29-
$this->assertSame($httpClient1, $httpClient2);
28+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
29+
$this->assertTrue($httpClient1->isMultiRequest());
30+
$this->assertInstanceOf(MultiCurlAdapter::class, $httpClient1->getAdapter());
31+
$this->assertNotSame($httpClient1, $httpClient2);
3032
}
3133

32-
public function testHttpClientFactoryResolveReturnsSameInstance(): void
34+
public function testHttpClientFactoryCreatesAsyncMultiRequest(): void
3335
{
34-
$factory = Di::get(HttpClientFactory::class);
36+
$success = static function (): void {
37+
};
3538

36-
$httpClient1 = $factory->resolve();
37-
$httpClient2 = $factory->resolve();
39+
$error = static function (): void {
40+
};
3841

39-
$this->assertSame($httpClient1, $httpClient2);
40-
}
41-
42-
private function resetHttpClientFactory(): void
43-
{
44-
if (!Di::isRegistered(HttpClientFactory::class)) {
45-
Di::register(HttpClientFactory::class);
46-
}
42+
$httpClient1 = HttpClientFactory::createAsyncMultiRequest($success, $error);
43+
$httpClient2 = HttpClientFactory::createAsyncMultiRequest($success, $error);
4744

48-
$factory = Di::get(HttpClientFactory::class);
49-
$this->setPrivateProperty($factory, 'instance', null);
45+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
46+
$this->assertTrue($httpClient1->isMultiRequest());
47+
$this->assertInstanceOf(MultiCurlAdapter::class, $httpClient1->getAdapter());
48+
$this->assertNotSame($httpClient1, $httpClient2);
5049
}
5150
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Quantum\Tests\Unit\HttpClient\Helpers;
4+
5+
use Quantum\HttpClient\Adapters\MultiCurlAdapter;
6+
use Quantum\HttpClient\Adapters\CurlAdapter;
7+
use Quantum\Tests\Unit\AppTestCase;
8+
use Quantum\HttpClient\HttpClient;
9+
10+
class HttpClientHelperFunctionsTest extends AppTestCase
11+
{
12+
public function testHttpRequestHelperCreatesSingleRequest(): void
13+
{
14+
$httpClient1 = httpRequest('https://example.com');
15+
$httpClient2 = httpRequest('https://example.org');
16+
17+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
18+
$this->assertInstanceOf(CurlAdapter::class, $httpClient1->getAdapter());
19+
$this->assertNotSame($httpClient1, $httpClient2);
20+
}
21+
22+
public function testHttpMultiRequestHelperCreatesMultiRequest(): void
23+
{
24+
$httpClient1 = httpMultiRequest();
25+
$httpClient2 = httpMultiRequest();
26+
27+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
28+
$this->assertTrue($httpClient1->isMultiRequest());
29+
$this->assertInstanceOf(MultiCurlAdapter::class, $httpClient1->getAdapter());
30+
$this->assertNotSame($httpClient1, $httpClient2);
31+
}
32+
33+
public function testHttpAsyncMultiRequestHelperCreatesAsyncMultiRequest(): void
34+
{
35+
$success = static function (): void {
36+
};
37+
38+
$error = static function (): void {
39+
};
40+
41+
$httpClient1 = httpAsyncMultiRequest($success, $error);
42+
$httpClient2 = httpAsyncMultiRequest($success, $error);
43+
44+
$this->assertInstanceOf(HttpClient::class, $httpClient1);
45+
$this->assertTrue($httpClient1->isMultiRequest());
46+
$this->assertInstanceOf(MultiCurlAdapter::class, $httpClient1->getAdapter());
47+
$this->assertNotSame($httpClient1, $httpClient2);
48+
}
49+
}

0 commit comments

Comments
 (0)