src/Service/InquiryControllerService.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\Inquiry\InquiryInterface;
  4. use App\Utils\FormUtil;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Psr\Container\ContainerInterface;
  7. use Symfony\Component\Form\Form;
  8. use Symfony\Component\Form\FormError;
  9. use Symfony\Component\Form\FormInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. class InquiryControllerService
  12. {
  13.     private ContainerInterface $container;
  14.     private EntityManagerInterface $em;
  15.     private MailService $mailer;
  16.     public function __construct(
  17.         ContainerInterface $container,
  18.         EntityManagerInterface $em,
  19.         MailService $mailer
  20.     ) {
  21.         $this->container $container;
  22.         $this->em $em;
  23.         $this->mailer $mailer;
  24.     }
  25.     /**
  26.      * 問い合わせフォームを準備する
  27.      * セッションが残っている場合アサインする
  28.      *
  29.      * @param Request $request
  30.      * @param string $sessionName
  31.      * @param string $formType
  32.      * @param InquiryInterface $inquiry
  33.      * @param array $formOptions
  34.      * @return FormInterface
  35.      */
  36.     public function prepareForm(
  37.         Request $request,
  38.         string $sessionName,
  39.         string $formType,
  40.         InquiryInterface $inquiry,
  41.         array $formOptions = []
  42.     ): FormInterface {
  43.         $form $this->container->get('form.factory')->create($formType$inquiry$formOptions);
  44.         if($request->getSession()->has($sessionName)) {
  45.             $formData $request->getSession()->get($sessionName);
  46.             FormUtil::submitAndGetData($form$formData);
  47.         }
  48.         return $form;
  49.     }
  50.     /**
  51.      * 確認ページでFormにRequestをアサインして送信済みFormを返す
  52.      *
  53.      * @param Request $request
  54.      * @param string $formType
  55.      * @param InquiryInterface $inquiry
  56.      * @param array $formOptions
  57.      * @return FormInterface
  58.      */
  59.     public function getSubmittedForm(
  60.         Request $request,
  61.         string $formType,
  62.         InquiryInterface $inquiry,
  63.         array $formOptions = []
  64.     ): FormInterface {
  65.         $form $this->container->get('form.factory')->create($formType$inquiry$formOptions);
  66.         $form->handleRequest($request);
  67.         return $form;
  68.     }
  69.     /**
  70.      * フォームをバリデーションする
  71.      *
  72.      * @param Request $request
  73.      * @param FormInterface $form
  74.      * @param InquiryInterface $inquiry
  75.      * @return bool
  76.      */
  77.     public function formValidation(
  78.         Request $request,
  79.         FormInterface $form,
  80.         InquiryInterface $inquiry
  81.     ): bool {
  82.         $isValid true;
  83.         if($form->isSubmitted() && $form->isValid()) {
  84.             $inquiry->setIp($request->getClientIp());
  85.             $repository $this->em->getRepository(get_class($inquiry));
  86.             if($repository->isContinuePost($inquiry)) {
  87.                 $form->addError(new FormError('連続送信は時間をおいてください'));
  88.                 $isValid false;
  89.             }
  90.         } else {
  91.             $form->addError(new FormError('入力内容に不備がありました'));
  92.             $isValid false;
  93.         }
  94.         return $isValid;
  95.     }
  96.     /**
  97.      * 入力データをセッションに保存、CSRFチェック用の空のフォームを返す
  98.      *
  99.      * @param Request $request
  100.      * @param FormInterface $form
  101.      * @param string $sessionName
  102.      * @return FormInterface
  103.      */
  104.     public function saveSession(
  105.         Request $request,
  106.         FormInterface $form,
  107.         string $sessionName
  108.     ): FormInterface {
  109.         $request->getSession()->set($sessionNameFormUtil::getViewData($form));
  110.         return $this->createConfirmForm();
  111.     }
  112.     /**
  113.      * 確認ページから送信へのCSRFトークンをもつ空のフォームを返す
  114.      * @return FormInterface
  115.      */
  116.     private function createConfirmForm(): FormInterface
  117.     {
  118.         return $this->container->get('form.factory')->create();
  119.     }
  120.     /**
  121.      * 送信前のCSRFトークンチェックを行う
  122.      *
  123.      * @param Request $request
  124.      * @return bool
  125.      */
  126.     public function handleConfirmForm(Request $request): bool
  127.     {
  128.         $confirmForm $this->createConfirmForm();
  129.         $confirmForm->handleRequest($request);
  130.         return ($confirmForm->isSubmitted() && $confirmForm->isValid());
  131.     }
  132.     /**
  133.      * 送信ページでセッションにある入力データをフォームにアサインする
  134.      *
  135.      * @param Request $request
  136.      * @param InquiryInterface $inquiry
  137.      * @param string $formType
  138.      * @param string $sessionName
  139.      * @return FormInterface|null
  140.      */
  141.     public function loadSessionAndGetForm(
  142.         Request $request,
  143.         InquiryInterface $inquiry,
  144.         string $formType,
  145.         string $sessionName
  146.     ): ?FormInterface
  147.     {
  148.         if (!$request->getSession()->has($sessionName)) {
  149.             return null;
  150.         }
  151.         $form $this->container->get('form.factory')->create($formType$inquiry, [
  152.             "csrf_protection" => false
  153.         ]);
  154.         $formData $request->getSession()->get($sessionName);
  155.         FormUtil::submitAndGetData($form$formData);
  156.         return $form;
  157.     }
  158.     /**
  159.      * DB永続化してセッションを削除
  160.      *
  161.      * @param Request $request
  162.      * @param InquiryInterface $inquiry
  163.      * @param string $sessionName
  164.      * @return $this
  165.      */
  166.     public function persistAndSessionRemove(
  167.         Request $request,
  168.         InquiryInterface $inquiry,
  169.         string $sessionName
  170.     ): self
  171.     {
  172.         $inquiry
  173.             ->setSendAt(new \DateTime())
  174.             ->setToken(null)
  175.         ;
  176.         $this->em->persist($inquiry);
  177.         $this->em->flush();
  178.         $request->getSession()->remove($sessionName);
  179.         return $this;
  180.     }
  181.     /**
  182.      * メール送信実行
  183.      * @param InquiryInterface $inquiry
  184.      * @param FormInterface $form
  185.      * @param callable|null $preSendConfig
  186.      * @return array
  187.      * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
  188.      * @throws \Twig\Error\LoaderError
  189.      * @throws \Twig\Error\RuntimeError
  190.      * @throws \Twig\Error\SyntaxError
  191.      */
  192.     public function sendmail(
  193.         InquiryInterface $inquiry,
  194.         FormInterface $form,
  195.         callable $preSendConfig null
  196.     ): array {
  197.         $sendEmails = [];
  198.         foreach($inquiry->getMailSendConfig() as $k => $mailConfig) {
  199.             $mailConfig['twigAssign']['form'] = $form->createView();
  200.             if(is_callable($preSendConfig)) {
  201.                 $mailConfig $preSendConfig($mailConfig$k);
  202.             }
  203.             $sendEmails[$k] = $this->mailer->send($mailConfig);
  204.         }
  205.         return $sendEmails;
  206.     }
  207. }