Run cached and simple services in one command.

This commit is contained in:
2020-12-30 15:07:51 +07:00
parent 5fba54bc83
commit dd4adf37d2
6 changed files with 54 additions and 8 deletions

View File

@@ -7,9 +7,12 @@ $jokeGuzzle = new \GuzzleHttp\Client([
]); ]);
$cache = new \Sarahman\SimpleCache\FileSystemCache(__DIR__ . '/tmp/cache'); $cache = new \Sarahman\SimpleCache\FileSystemCache(__DIR__ . '/tmp/cache');
$jokeService = new \App\Service\JokeService($jokeGuzzle); $jokeService = new \App\Service\JokeService($jokeGuzzle);
$jokeCacheService = new \App\Service\JokeCachedService($jokeGuzzle);
$jokeOperation = new \App\Operation\JokeOperation($jokeService, $cache); $jokeOperation = new \App\Operation\JokeOperation($jokeService, $cache);
$jokeOperationWithCache = new \App\Operation\JokeOperation($jokeCacheService, $cache);
$app = new \Ahc\Cli\Application('Joke App', 'v0.0.1'); $app = new \Ahc\Cli\Application('Joke App', 'v0.0.1');
$app->add(new \App\Command\JokeCommand($jokeOperation)); $app->add(new \App\Command\JokeCommand($jokeOperation, $jokeOperationWithCache));
$app->handle($_SERVER['argv']); $app->handle($_SERVER['argv']);

View File

@@ -5,11 +5,13 @@ declare(strict_types=1);
namespace App\Command; namespace App\Command;
use App\Operation\JokeOperation; use App\Operation\JokeOperation;
use Psr\SimpleCache\InvalidArgumentException;
class JokeCommand extends \Ahc\Cli\Input\Command class JokeCommand extends \Ahc\Cli\Input\Command
{ {
public function __construct( public function __construct(
private JokeOperation $jokeOperation private JokeOperation $jokeOperation,
private JokeOperation $jokeOperationWithCache,
) { ) {
parent::__construct('joke', 'Get some joke'); parent::__construct('joke', 'Get some joke');
} }
@@ -17,7 +19,15 @@ class JokeCommand extends \Ahc\Cli\Input\Command
public function execute(): void public function execute(): void
{ {
$io = $this->app()->io(); $io = $this->app()->io();
$joke = $this->jokeOperation->getRandomJoke();
$io->green($joke, true); try {
$joke = $this->jokeOperation->getRandomJoke();
$io->green("Joke: {$joke}", true);
$cachedJoke = $this->jokeOperationWithCache->getRandomJoke();
$io->green("Cached joke: {$cachedJoke}", true);
} catch (\Throwable | InvalidArgumentException $exception) {
$io->error($exception->getMessage(), true);
}
} }
} }

View File

@@ -7,6 +7,7 @@ namespace App\Operation;
use App\Service\CachedJokes; use App\Service\CachedJokes;
use App\Service\JokeInterface; use App\Service\JokeInterface;
use Psr\SimpleCache\CacheInterface; use Psr\SimpleCache\CacheInterface;
use Psr\SimpleCache\InvalidArgumentException;
class JokeOperation class JokeOperation
{ {
@@ -16,6 +17,11 @@ class JokeOperation
) { ) {
} }
/**
* Get text of random joke
* @return string
* @throws InvalidArgumentException
*/
public function getRandomJoke(): string public function getRandomJoke(): string
{ {
$reflection = new \ReflectionClass($this->jokeService); $reflection = new \ReflectionClass($this->jokeService);

View File

@@ -4,7 +4,9 @@ declare(strict_types=1);
namespace App\Service; namespace App\Service;
#[\Attribute] use Psr\SimpleCache\CacheInterface;
#[\Attribute(\Attribute::TARGET_METHOD)]
class CachedJokes class CachedJokes
{ {
public function getCacheKey(string $jokeType): string public function getCacheKey(string $jokeType): string

View File

@@ -0,0 +1,14 @@
<?php
declare(strict_types=1);
namespace App\Service;
class JokeCachedService extends JokeService implements JokeInterface
{
#[CachedJokes]
public function getRandomJoke(): array
{
return parent::getRandomJoke();
}
}

View File

@@ -4,6 +4,9 @@ declare(strict_types=1);
namespace App\Service; namespace App\Service;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\RequestOptions;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
/** /**
@@ -13,11 +16,14 @@ use Psr\Http\Message\ResponseInterface;
class JokeService implements JokeInterface class JokeService implements JokeInterface
{ {
public function __construct( public function __construct(
protected \GuzzleHttp\Client $guzzleClient protected Client $guzzleClient
) { ) {
} }
#[CachedJokes] /**
* @return array
* @throws GuzzleException
*/
public function getRandomJoke(): array public function getRandomJoke(): array
{ {
$response = $this->sendRequest(static::CATEGORY_ANY); $response = $this->sendRequest(static::CATEGORY_ANY);
@@ -25,11 +31,16 @@ class JokeService implements JokeInterface
return \json_decode($responseContent, true); return \json_decode($responseContent, true);
} }
/**
* @param string ...$categories
* @return ResponseInterface
* @throws GuzzleException
*/
protected function sendRequest(string ...$categories): ResponseInterface protected function sendRequest(string ...$categories): ResponseInterface
{ {
$categoriesStr = implode(',', $categories); $categoriesStr = implode(',', $categories);
return $this->guzzleClient->get("/joke/{$categoriesStr}", [ return $this->guzzleClient->get("/joke/{$categoriesStr}", [
\GuzzleHttp\RequestOptions::QUERY => [ RequestOptions::QUERY => [
'format' => 'json', 'format' => 'json',
'amount' => 1, 'amount' => 1,
'type' => 'single', 'type' => 'single',