vendor/setono/sylius-mailchimp-plugin/src/Controller/Action/SubscribeToNewsletterAction.php line 21

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Setono\SyliusMailchimpPlugin\Controller\Action;
  4. use Setono\SyliusMailchimpPlugin\Client\ClientInterface;
  5. use Setono\SyliusMailchimpPlugin\Form\Type\SubscribeToNewsletterType;
  6. use Setono\SyliusMailchimpPlugin\Model\AudienceInterface;
  7. use Setono\SyliusMailchimpPlugin\Repository\AudienceRepositoryInterface;
  8. use Sylius\Component\Channel\Context\ChannelContextInterface;
  9. use Symfony\Component\Form\FormError;
  10. use Symfony\Component\Form\FormFactoryInterface;
  11. use Symfony\Component\Form\FormInterface;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use Twig\Environment;
  17. final class SubscribeToNewsletterAction
  18. {
  19.     /** @var FormFactoryInterface */
  20.     private $formFactory;
  21.     /** @var Environment */
  22.     private $twig;
  23.     /** @var TranslatorInterface */
  24.     private $translator;
  25.     /** @var ChannelContextInterface */
  26.     private $channelContext;
  27.     /** @var AudienceRepositoryInterface */
  28.     private $audienceRepository;
  29.     /** @var ClientInterface */
  30.     private $client;
  31.     public function __construct(
  32.         FormFactoryInterface $formFactory,
  33.         Environment $twig,
  34.         TranslatorInterface $translator,
  35.         ChannelContextInterface $channelContext,
  36.         AudienceRepositoryInterface $audienceRepository,
  37.         ClientInterface $client
  38.     ) {
  39.         $this->formFactory $formFactory;
  40.         $this->twig $twig;
  41.         $this->translator $translator;
  42.         $this->channelContext $channelContext;
  43.         $this->audienceRepository $audienceRepository;
  44.         $this->client $client;
  45.     }
  46.     public function __invoke(Request $request): Response
  47.     {
  48.         $form $this->formFactory->create(SubscribeToNewsletterType::class);
  49.         $form->handleRequest($request);
  50.         if ($form->isSubmitted()) {
  51.             $audience $this->getAudience();
  52.             if (null === $audience) {
  53.                 return $this->json(
  54.                     $this->translator->trans('setono_sylius_mailchimp.ui.no_audience_associated_with_channel'),
  55.                     400
  56.                 );
  57.             }
  58.             if (!$form->isValid()) {
  59.                 $errors $this->getErrorsFromForm($form);
  60.                 if (is_string($errors)) {
  61.                     $errors = [$errors];
  62.                 }
  63.                 return $this->json(
  64.                     $this->translator->trans('setono_sylius_mailchimp.ui.an_error_occurred'), 400$errors
  65.                 );
  66.             }
  67.             $this->client->subscribeEmail($audience$form->get('email')->getData());
  68.             return $this->json($this->translator->trans('setono_sylius_mailchimp.ui.subscribed_successfully'));
  69.         }
  70.         $template $request->query->get('template''@SetonoSyliusMailchimpPlugin/Shop/Subscribe/content.html.twig');
  71.         $content $this->twig->render($template, [
  72.             'form' => $form->createView(),
  73.         ]);
  74.         return new Response($content);
  75.     }
  76.     private function json(string $messageint $status 200, array $errors = []): JsonResponse
  77.     {
  78.         return new JsonResponse([
  79.             'message' => $message,
  80.             'errors' => $errors,
  81.         ], $status);
  82.     }
  83.     /**
  84.      * Taken from https://symfonycasts.com/screencast/javascript/post-proper-api-endpoint#codeblock-99cf6afd45
  85.      *
  86.      * @return array|string
  87.      */
  88.     private function getErrorsFromForm(FormInterface $form)
  89.     {
  90.         /** @var FormError $error */
  91.         foreach ($form->getErrors() as $error) {
  92.             // only supporting 1 error per field
  93.             // and not supporting a "field" with errors, that has more
  94.             // fields with errors below it
  95.             return $error->getMessage();
  96.         }
  97.         $errors = [];
  98.         foreach ($form->all() as $childForm) {
  99.             $childError $this->getErrorsFromForm($childForm);
  100.             if (is_string($childError)) {
  101.                 $errors[$childForm->getName()] = $childError;
  102.             }
  103.         }
  104.         return $errors;
  105.     }
  106.     private function getAudience(): ?AudienceInterface
  107.     {
  108.         $channel $this->channelContext->getChannel();
  109.         return $this->audienceRepository->findOneByChannel($channel);
  110.     }
  111. }