src/WebBundle/Service/GoogleTranslateService.php line 148

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace WebBundle\Service;
  4. use DateTimeImmutable;
  5. use FlexApp\Service\RedisCachePool;
  6. use Google\Cloud\Core\Exception\GoogleException;
  7. use Google\Cloud\Core\Exception\ServiceException;
  8. use Psr\Cache\InvalidArgumentException;
  9. use WebBundle\Client\GoogleTranslateClient;
  10. use WebBundle\Constant\RedisKeysConstant;
  11. use WebBundle\Helper\ArticleSettingsHelper;
  12. use WebBundle\Repository\ArticleRepository;
  13. use WebBundle\Repository\ReviewsCacheRepository;
  14. class GoogleTranslateService
  15. {
  16.     // отключить кеш - поставить в false
  17.     private const ENABLE_CACHE true;
  18.     private GoogleTranslateClient $googleTranslateClient;
  19.     private RedisCachePool $redisCachePool;
  20.     private ArticleRepository $articleRepository;
  21.     private ReviewsCacheRepository $reviewsCacheRepository;
  22.     public function __construct(
  23.         GoogleTranslateClient $googleTranslateClient,
  24.         RedisCachePool $redisCachePool,
  25.         ArticleRepository $articleRepository,
  26.         ReviewsCacheRepository $reviewsCacheRepository
  27.     ) {
  28.         $this->googleTranslateClient $googleTranslateClient;
  29.         $this->redisCachePool $redisCachePool;
  30.         $this->articleRepository $articleRepository;
  31.         $this->reviewsCacheRepository $reviewsCacheRepository;
  32.     }
  33.     public function translateCommentForArticle(int $idstring $toLang): array
  34.     {
  35.         $toLang strtolower($toLang);
  36.         $redisCacheKey RedisKeysConstant::COMMENT_TRANSLATE $id $toLang;
  37.         if (self::ENABLE_CACHE && $data $this->iHaveRedisDataByNameSpaceAndKey($redisCacheKey)) {
  38.             return (array) $data;
  39.         }
  40.         // ищем в репке
  41.         $article $this->articleRepository->find($id);
  42.         if (null === $article) {
  43.             return $this->prepareResponse(nullnull'Cant find article');
  44.         }
  45.         // если запрашиваемый язык перевода есть у арт и не пустой
  46.         $method 'getDescription' ucfirst($toLang);
  47.         if (method_exists($article$method)) {
  48.             if ($article->$method() !== null) {
  49.                 $content = (string) $article->$method();
  50.                 // необходимо постОбработать контент на предмет наличия ссылок
  51.                 $content ArticleSettingsHelper::replaceLinkToReal($content$this->articleRepository);
  52.                 $contentForResponse $this->prepareResponse($contentfalse);
  53.                 $this->setContentToRedis($redisCacheKey$contentForResponseRedisKeysConstant::COMMENT_TRANSLATE()->expire());
  54.                 return $contentForResponse;
  55.             }
  56.         }
  57.         // переводить будем с английского
  58.         $content $article->getDescriptionEn();
  59.         if (empty($content)) {
  60.             return $this->prepareResponse(nullnull'Haven\'t eng description');
  61.         }
  62.         // необходимо предОбработать контент на предмет наличия ссылок
  63.         $content ArticleSettingsHelper::replaceLinkToReal($content$this->articleRepository);
  64.         // запросим перевод у гугла
  65.         $translateData $this->translate($content$toLang);
  66.         if (null === $translateData) {
  67.             return $this->prepareResponse(''true);
  68.         }
  69.         $translateResponse $this->prepareResponse($translateDatatrue);
  70.         $this->setContentToRedis($redisCacheKey$translateResponseRedisKeysConstant::COMMENT_TRANSLATE()->expire());
  71.         return $translateResponse;
  72.     }
  73.     public function translateReviewAboutService(int $idstring $toLang): array
  74.     {
  75.         $toLang strtolower($toLang);
  76.         $redisCacheKey RedisKeysConstant::REVIEW_ABOUT_SERVICE $id $toLang;
  77.         if (self::ENABLE_CACHE && $data $this->iHaveRedisDataByNameSpaceAndKey($redisCacheKey)) {
  78.             return (array) $data;
  79.         }
  80.         // ищем в репке
  81.         $review $this->reviewsCacheRepository->getReview($id);
  82.         if (null === $review) {
  83.             return $this->prepareResponse(nullnull'Cant find review');
  84.         }
  85.         // если отзыв на запрашиваемом языке
  86.         $content $review->getContent();
  87.         if (strtolower($review->getLanguage()) === $toLang) {
  88.             $contentForResponse $this->prepareResponse($contentfalse);
  89.             $this->setContentToRedis($redisCacheKey$contentForResponseRedisKeysConstant::REVIEW_ABOUT_SERVICE()->expire());
  90.             return $contentForResponse;
  91.         }
  92.         if (empty($content)) {
  93.             return $this->prepareResponse(nullnull'Empty review');
  94.         }
  95.         // запросим перевод у гугла
  96.         $translateData $this->translate($content$toLang);
  97.         if (null === $translateData) {
  98.             return $this->prepareResponse(''true);
  99.         }
  100.         $translateResponse $this->prepareResponse($translateDatatrue);
  101.         $this->setContentToRedis($redisCacheKey$translateResponseRedisKeysConstant::REVIEW_ABOUT_SERVICE()->expire());
  102.         return $translateResponse;
  103.     }
  104.     /**
  105.      * Получаем данные из редиса, если есть по ключу $pool массив и содержит ключ $redisCacheKey
  106.      *
  107.      * @param string $redisCacheKey
  108.      * @return mixed|null
  109.      */
  110.     private function iHaveRedisDataByNameSpaceAndKey(string $redisCacheKey)
  111.     {
  112.         try {
  113.             if ($redisCacheItem $this->redisCachePool->getPool()->getItem($redisCacheKey)) {
  114.                 return $redisCacheItem->get();
  115.             }
  116.         } catch (InvalidArgumentException $e) {
  117.             return null;
  118.         }
  119.         return null;
  120.     }
  121.     private function setContentToRedis(string $redisCacheKey$content, ?DateTimeImmutable $expire): void
  122.     {
  123.         $pool $this->redisCachePool->getPool();
  124.         try {
  125.             $item $pool->getItem($redisCacheKey);
  126.         } catch (InvalidArgumentException $e) {
  127.             return;
  128.         }
  129.         $item->expiresAt($expire);
  130.         $item->set($content);
  131.         $pool->save($item);
  132.     }
  133.     private function translate(string $contentstring $toLang): ?string
  134.     {
  135.         return $this->translateAndGetFullArray($content$toLang)['text'] ?? null;
  136.     }
  137.     private function translateAndGetFullArray(string $contentstring $toLang): ?array
  138.     {
  139.         try {
  140.             return $this->googleTranslateClient->translate($content$toLang);
  141.         } catch (ServiceException|GoogleException $e) {
  142.             return null;
  143.         }
  144.     }
  145.     private function prepareResponse(?string $content, ?bool $isGoogleTranslate null, ?string $error null): array
  146.     {
  147.         $response = [];
  148.         if (null !== $content) {
  149.             $response['content'] = $content;
  150.         }
  151.         if (null !== $isGoogleTranslate) {
  152.             $response['translatedByGoogle'] = $isGoogleTranslate;
  153.         }
  154.         if (null !== $error) {
  155.             $response['error'] = $error;
  156.         }
  157.         return $response;
  158.     }
  159. }