src/Controller/SaloonListController.php line 57

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-04-15
  5.  * Time: 19:51
  6.  */
  7. namespace App\Controller;
  8. use AngelGamez\PorpaginasBundle\Controller\PaginationTrait;
  9. use App\Entity\Location\City;
  10. use App\Repository\DistrictRepository;
  11. use App\Repository\SaloonRepository;
  12. use App\Service\CountryCurrencyResolver;
  13. use App\Service\Features;
  14. use App\Service\ResponsiveAssetsService;
  15. use App\Specification\QueryModifier\FreeProfilesFeatureSaloonOrder;
  16. use App\Specification\Saloon\SaloonIsNotHidden;
  17. use App\Specification\QueryModifier\SaloonOrderedByStatus;
  18. use App\Specification\Saloon\SaloonInMoskowDistricts;
  19. use App\Specification\Saloon\SaloonIsActive;
  20. use App\Specification\Saloon\SaloonIsLocated;
  21. use App\Specification\Saloon\SaloonIsVip;
  22. use Flagception\Bundle\FlagceptionBundle\Annotations\Feature;
  23. use Happyr\DoctrineSpecification\Spec;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  26. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\RequestStack;
  29. use Symfony\Component\HttpFoundation\Response;
  30. class SaloonListController extends AbstractController
  31. {
  32.     use PaginationTrait;
  33.     const ENTRIES_ON_PAGE 36;
  34.     private mixed $perPage;
  35.     public function __construct(
  36.         private SaloonRepository $saloonRepository,
  37.         private DistrictRepository $districtRepository,
  38.         private Features $features,
  39.         private RequestStack $requestStack,
  40.         private ResponsiveAssetsService $responsiveAssetsService,
  41.         ParameterBagInterface $parameterBag
  42.     )
  43.     {
  44.         $this->perPage $parameterBag->get('saloon_list.per_page');
  45.     }
  46.     /**
  47.      * @Feature("has_saloons")
  48.      */
  49.     #[ParamConverter('city'converter'city_converter')]
  50.     public function listByCity(Request $requestCity $city): Response
  51.     {
  52.         $criteria Spec::andX(
  53.             $this->features->free_profiles() ? new SaloonIsNotHidden() : new SaloonIsActive(),
  54.             SaloonIsLocated::withinCity($city),
  55.             $this->features->free_profiles() ? new FreeProfilesFeatureSaloonOrder() : new SaloonOrderedByStatus()
  56.         );
  57.         $result $this->saloonRepository->matchingSpec($criteria);
  58.         $saloons $this->takePage($result$this->perPage);
  59.         return $this->render('SaloonList/list.html.twig', [
  60.             'saloons' => $saloons,
  61.         ]);
  62.     }
  63.     /**
  64.      * @Feature("has_saloons")
  65.      */
  66.     #[ParamConverter('city'converter'city_converter')]
  67.     public function listForVipRelax(CountryCurrencyResolver $countryCurrencyResolverRequest $requestCity $city): Response
  68.     {
  69.         $minPrice $countryCurrencyResolver->getValueByCountryCode($city->getCountryCode(), [
  70.             'RUB' => 4000,
  71.             'UAH' => 1200,
  72.             'USD' => 100,
  73.             'EUR' => 100,
  74.         ]);
  75.         $districts = [];
  76.         foreach (SaloonInMoskowDistricts::$districtsUri as $uri) {
  77.             if (null !== $district $this->districtRepository->ofUriIdentityWithinCity($uri$city)) {
  78.                 $districts[] = $district;
  79.             }
  80.         }
  81.         if (!empty($districts)) {
  82.             $criteria Spec::andX(
  83.                 $this->features->free_profiles() ? new SaloonIsNotHidden() : new SaloonIsActive(),
  84.                 SaloonIsLocated::withinCity($city),
  85.                 new SaloonIsVip($city$districts$minPrice),
  86.                 $this->features->free_profiles() ? new FreeProfilesFeatureSaloonOrder() : new SaloonOrderedByStatus()
  87.             );
  88.             $result $this->saloonRepository->matchingSpec($criteria);
  89.             $saloons $this->takePage($result$this->perPage);
  90.         } else {
  91.             $saloons $this->emptyPagination();
  92.         }
  93.         return $this->render('SaloonList/list.html.twig', [
  94.             'saloons' => $saloons,
  95.         ]);
  96.     }
  97.     protected function render(string $view, array $parameters = [], Response $response null): Response
  98.     {
  99.         if($this->requestStack->getCurrentRequest()->getMethod() == 'POST') {
  100.             $response parent::render('SaloonList/list.saloons.html.twig'$parameters$response);
  101.             $content preg_replace('/\s{2,}/'' '$response->getContent());
  102.             $response->setContent($content);
  103.             return $response;
  104.         } else {
  105.             return parent::render($view$parameters$response);
  106.         }
  107.     }
  108. }