src/Controller/Shop/ContactController.php line 65

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Shop;
  3. use App\Entity\ContactRequest;
  4. use App\Entity\User\AdminUser;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Sylius\Bundle\CoreBundle\Form\Type\ContactType;
  7. use Sylius\Component\Channel\Context\ChannelContextInterface;
  8. use Sylius\Component\Core\Model\ChannelInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  15. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  16. use Symfony\Component\Mailer\Mailer;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\Mime\Email;
  19. use Twig\Environment;
  20. use Twig\Error\LoaderError;
  21. use Twig\Error\RuntimeError;
  22. use Twig\Error\SyntaxError;
  23. use Webmozart\Assert\Assert;
  24. final class ContactController extends AbstractController
  25. {
  26.     /** @var EngineInterface|Environment */
  27.     private Environment $templatingEngine;
  28.     /** @var ChannelContextInterface */
  29.     private ChannelContextInterface $channelContext;
  30.     /** @var EntityManagerInterface */
  31.     private EntityManagerInterface $em;
  32.     /** @var Mailer */
  33.     private MailerInterface $mailer;
  34.     /**
  35.      * @param Environment $templatingEngine
  36.      * @param ChannelContextInterface $channelContext
  37.      * @param EntityManagerInterface $em
  38.      * @param MailerInterface $mailer
  39.      */
  40.     public function __construct(Environment $templatingEngineChannelContextInterface $channelContextEntityManagerInterface $emMailerInterface $mailer)
  41.     {
  42.         $this->templatingEngine $templatingEngine;
  43.         $this->channelContext $channelContext;
  44.         $this->em $em;
  45.         $this->mailer $mailer;
  46.     }
  47.     /**
  48.      * @param Request $request
  49.      * @return Response
  50.      * @throws LoaderError
  51.      * @throws RuntimeError
  52.      * @throws SyntaxError
  53.      * @throws TransportExceptionInterface
  54.      */
  55.     public function requestAction(Request $request): Response
  56.     {
  57.         $form $this->createForm(ContactType::class, new ContactRequest());
  58.         $form->handleRequest($request);
  59.         if ($form->isSubmitted() && $form->isValid()) {
  60.             $contactRequest $form->getData();
  61.             $channel $this->channelContext->getChannel();
  62.             /** @var ChannelInterface $channel */
  63.             Assert::isInstanceOf($channelChannelInterface::class);
  64.             $admins $this->em->getRepository(AdminUser::class)->findAll();
  65.             foreach ($admins as $admin) {
  66.                 $adminEmails[] = $admin->getEmail();
  67.             }
  68.             $this->em->persist($contactRequest);
  69.             $this->em->flush();
  70.             if (empty($adminEmails)) {
  71.                 $errorMessage $this->getSyliusAttribute(
  72.                     $request,
  73.                     'error_flash',
  74.                     'sylius.contact.request_error'
  75.                 );
  76.                 /** @var FlashBagInterface $flashBag */
  77.                 $flashBag $request->getSession()->getBag('flashes');
  78.                 $flashBag->add('error'$errorMessage);
  79.                 return new RedirectResponse($request->headers->get('referer'));
  80.             }
  81.             $this->sendContactRequestMail($adminEmails$contactRequest->getSubject(), $contactRequest->getMessage());
  82.             $successMessage $this->getSyliusAttribute(
  83.                 $request,
  84.                 'success_flash',
  85.                 'sylius.contact.request_success'
  86.             );
  87.             /** @var FlashBagInterface $flashBag */
  88.             $flashBag $request->getSession()->getBag('flashes');
  89.             $flashBag->add('success'$successMessage);
  90.             return new RedirectResponse($request->headers->get('referer'));
  91.         }
  92.         $template $this->getSyliusAttribute($request'template''@SyliusShop/Contact/request.html.twig');
  93.         return new Response($this->templatingEngine->render($template, ['form' => $form->createView()]));
  94.     }
  95.     /**
  96.      * @param Request $request
  97.      * @param string $attributeName
  98.      * @param string|null $default
  99.      * @return string|null
  100.      */
  101.     private function getSyliusAttribute(Request $requeststring $attributeName, ?string $default): ?string
  102.     {
  103.         $attributes $request->attributes->get('_sylius');
  104.         return $attributes[$attributeName] ?? $default;
  105.     }
  106.     /**
  107.      * @param array $adminEmails
  108.      * @param string $subject
  109.      * @param string $message
  110.      * @return void
  111.      * @throws TransportExceptionInterface
  112.      */
  113.     public function sendContactRequestMail(array $adminEmailsstring $subjectstring $message): void
  114.     {
  115.         foreach ($adminEmails as $adminEmail) {
  116.             $email = (new Email)
  117.                 ->to($adminEmail)
  118.                 ->subject($subject)
  119.                 ->text('Nouvelle demande de contact: ' $message)
  120.             ;
  121.             $this->mailer->send($email);
  122.         }
  123.     }
  124. }