src/Service/Promocode/PromocodeApply.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Promocode;
  4. use App\Repository\PromoCodeAdsRepository;
  5. use App\Repository\PromoCodeRepository;
  6. use Exception;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. class PromocodeApply
  10. {
  11.     const SESSION_KEY_NAME '_apply_promocode';
  12.     /**
  13.      * @var SessionInterface
  14.      */
  15.     private $session;
  16.     /**
  17.      * @var PromoCodeRepository
  18.      */
  19.     private $promoCodeRepository;
  20.     /**
  21.      * @var PromoCodeAdsRepository
  22.      */
  23.     private $promoCodeAdsRepository;
  24.     public function __construct(
  25.         PromoCodeRepository $promoCodeRepository,
  26.         PromoCodeAdsRepository $promoCodeAdsRepository,
  27.         RequestStack $requestStack
  28.     ) {
  29.         $this->session $requestStack->getSession();
  30.         $this->promoCodeRepository $promoCodeRepository;
  31.         $this->promoCodeAdsRepository $promoCodeAdsRepository;
  32.     }
  33.     public function isApplyCode(): bool
  34.     {
  35.         if (!$this->session->has(self::SESSION_KEY_NAME)) {
  36.             return false;
  37.         }
  38.         if ($this->session->get(self::SESSION_KEY_NAME)) {
  39.             return true;
  40.         }
  41.         return false;
  42.     }
  43.     public function getCode(): ?string
  44.     {
  45.         if ($this->isApplyCode()) {
  46.             return $this->session->get(self::SESSION_KEY_NAME);
  47.         }
  48.         return null;
  49.     }
  50.     /**
  51.      * @throws Exception
  52.      */
  53.     public function apply(string $code)
  54.     {
  55.         $adsCodeIsAvailable $this->promoCodeAdsRepository->checkAvailableCode($code);
  56.         if (!$adsCodeIsAvailable) {
  57.             $userCodeIsAvailable $this->promoCodeRepository->checkAvailableCode($code);
  58.             if (!$userCodeIsAvailable) {
  59.                 throw new Exception('Промокод не найден. Попробуйте другой');
  60.             }
  61.         }
  62.         $this->session->set(self::SESSION_KEY_NAME$code);
  63.     }
  64.     public function cancel(): void
  65.     {
  66.         $this->session->remove(self::SESSION_KEY_NAME);
  67.     }
  68. }