src/Component/Core/Shop/Controller/Vendor/IndexAction.php line 20

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace BitBag\OpenMarketplace\Component\Core\Shop\Controller\Vendor;
  4. use BitBag\OpenMarketplace\Component\Elasticsearch\Finder\VendorProductsFinderInterface;
  5. use BitBag\OpenMarketplace\Component\Elasticsearch\Form\Resolver\ListProductsFacetsResolverInterface;
  6. use BitBag\OpenMarketplace\Component\Elasticsearch\Form\Type\ListProductsType;
  7. use BitBag\OpenMarketplace\Component\Elasticsearch\Provider\RedirectResponseProviderInterface;
  8. use BitBag\OpenMarketplace\Component\Vendor\Entity\VendorInterface;
  9. use BitBag\OpenMarketplace\Component\Vendor\Repository\VendorRepositoryInterface;
  10. use Sylius\Component\Core\Formatter\StringInflector;
  11. use Symfony\Component\Form\FormFactoryInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  15. use Twig\Environment;
  16. final class IndexAction
  17. {
  18.     public function __construct(
  19.         private VendorRepositoryInterface $vendorRepository,
  20.         private VendorProductsFinderInterface $vendorProductsFinder,
  21.         private Environment $twig,
  22.         private FormFactoryInterface $formFactory,
  23.         private ListProductsFacetsResolverInterface $facetsResolver,
  24.         private RedirectResponseProviderInterface $redirectResponseProvider,
  25.         ) {
  26.     }
  27.     public function __invoke(Request $request): Response
  28.     {
  29.         $vendorSlug $request->get('vendor_slug');
  30.         $redirectResponse $this->redirectResponseProvider->provide($request, [
  31.             'vendor_slug' => $vendorSlug,
  32.         ]);
  33.         if (null !== $redirectResponse) {
  34.             return $redirectResponse;
  35.         }
  36.         $vendor $this->vendorRepository->findOneBySlug($vendorSlug);
  37.         if (!$vendor instanceof VendorInterface) {
  38.             throw new NotFoundHttpException(sprintf('Vendor with slug "%s" was not found.'$vendorSlug));
  39.         }
  40.         $data = [
  41.             'vendor_name' => StringInflector::nameToLowercaseCode($vendor->getCompanyName() ?? ''),
  42.             'name' => null,
  43.         ];
  44.         $form $this->formFactory->create(ListProductsType::class, $data, [
  45.             'facets_resolver' => $this->facetsResolver,
  46.         ]);
  47.         $form->handleRequest($request);
  48.         $data array_merge(
  49.             $data,
  50.             $form->getData(),
  51.             $request->query->all(),
  52.         );
  53.         $products $this->vendorProductsFinder->find($data);
  54.         return new Response($this->twig->render('Context/Vendor/VendorPage/index.html.twig', [
  55.             'form' => $form->createView(),
  56.             'products' => $products,
  57.             'vendor' => $vendor,
  58.         ]));
  59.     }
  60. }