src/Controller/Mvc/ContactController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Mvc;
  3. use App\Entity\Contact\Data;
  4. use App\Event\Contact\Data\Send\PostMailSendEvent;
  5. use App\Event\Contact\Data\Send\PostPersistEvent;
  6. use App\Event\Contact\Data\Send\PrePersistEvent;
  7. use App\Form\Contact\DataType;
  8. use App\MailConfigure\ContactConfigure;
  9. use App\Repository\Contact\DataRepository;
  10. use App\Service\InquiryControllerService;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. #[Route(path"/contact")]
  18. class ContactController extends AbstractController
  19. {
  20.     private const SESSION_NAME "inquiry_contact";
  21.     private const INDEX_TEMPLATE "pages/contact/index.html.twig";
  22.     private const INDEX_ROUTE "contact_index";
  23.     #[Route(
  24.         path"/",
  25.         name"contact_index",
  26.         methods: ["GET"]
  27.     )]
  28.     public function index(
  29.         Request $request,
  30.         InquiryControllerService $service
  31.     ): Response {
  32.         $service->setContainer($this->container);
  33.         $form $service->prepareForm(
  34.             $request,
  35.             new Data(),
  36.             self::SESSION_NAME,
  37.             DataType::class
  38.         );
  39.         return $this->render(self::INDEX_TEMPLATE, [
  40.             "form" => $form->createView(),
  41.             "retry" => false
  42.         ]);
  43.     }
  44.     #[Route(
  45.         path"/confirm",
  46.         name"contact_confirm",
  47.         methods: ["POST"]
  48.     )]
  49.     public function confirm(
  50.         Request $request,
  51.         InquiryControllerService $service,
  52.         DataRepository $repository
  53.     ): Response {
  54.         $service->setContainer($this->container);
  55.         $contact = new Data();
  56.         $form $service->getSubmittedForm(
  57.             $request,
  58.             $contact,
  59.             DataType::class
  60.         );
  61.         if(false === $service->formValidation($request$contact$form$repository)) {
  62.             return $this->render(self::INDEX_TEMPLATE, [
  63.                 "form" => $form->createView(),
  64.                 "retry" => true
  65.             ]);
  66.         }
  67.         return $this->render('pages/contact/confirm.html.twig', [
  68.             "inquiry" => $contact,
  69.             "form" => $form->createView(),
  70.             "confirmForm" => $service
  71.                 ->saveAndGetConfirmForm($request$formself::SESSION_NAME)
  72.                 ->createView()
  73.         ]);
  74.     }
  75.     #[Route(
  76.         path"/send",
  77.         name"contact_send",
  78.         methods: ["POST"]
  79.     )]
  80.     public function send(
  81.         Request                  $request,
  82.         InquiryControllerService $service,
  83.         DataRepository           $repository,
  84.         ContactConfigure         $configure,
  85.         EventDispatcherInterface $eventDispatcher
  86.     ): Response {
  87.         $service->setContainer($this->container);
  88.         if(!$service->handleConfirmForm($request)) {
  89.             return $this->redirectToRoute(self::INDEX_ROUTE);
  90.         }
  91.         $contact = new Data();
  92.         if(!$form $service->loadAndGetForm(
  93.             $request,
  94.             $contact,
  95.             DataType::class,
  96.             self::SESSION_NAME
  97.         )) {
  98.             return $this->redirectToRoute(self::INDEX_ROUTE);
  99.         }
  100.         if(!$service->formValidation($request$contact$form$repository)) {
  101.             return $this->render(self::INDEX_TEMPLATE, [
  102.                 "form" => $service->createRetryForm(
  103.                     DataType::class,
  104.                     $contact,
  105.                     "送信時にエラーが発生しました"
  106.                 )->createView(),
  107.                 "retry" => true
  108.             ]);
  109.         }
  110.         $preEvent = new PrePersistEvent($contact$form);
  111.         $eventDispatcher->dispatch($preEvent'contact_data_send.pre_persist');
  112.         $repository->add($contact);
  113.         $postEvent = new PostPersistEvent($contact$form);
  114.         $eventDispatcher->dispatch($postEvent'contact_data_send.post_persist');
  115.         $sendSuccess true;
  116.         if(!$service->mailSend($configure"client"$contact$form)) {
  117.             $sendSuccess false;
  118.         }
  119.         if(!$service->mailSend($configure"reply"$contact$form)) {
  120.             $sendSuccess false;
  121.         }
  122.         if(false === $sendSuccess) {
  123.             return $this->render(self::INDEX_TEMPLATE, [
  124.                 "form" => $service->createRetryForm(
  125.                     DataType::class,
  126.                     $contact,
  127.                     "送信処理に失敗しました"
  128.                 )->createView(),
  129.                 "retry" => true
  130.             ]);
  131.         }
  132.         $postSendEvent = new PostMailSendEvent($contact$form);
  133.         $eventDispatcher->dispatch($postSendEvent'contact_data_send.post_mail_send');
  134.         // pardot送信などの場合ここでHTMLレンダリング
  135. //        return $this->render('pages/contact/send.html.twig', [
  136. //            "inquiry" => $contact
  137. //        ]);
  138.         return $this->redirectToRoute("contact_complete");
  139.     }
  140.     #[Route(
  141.         path"/complete",
  142.         name"contact_complete",
  143.         methods: ["GET"]
  144.     )]
  145.     public function complete(
  146.         Request $request
  147.     ): Response {
  148.         $request->getSession()->remove(self::SESSION_NAME);
  149.         return $this->render('pages/contact/complete.html.twig', []);
  150.     }
  151.     #[Route(
  152.         path"/failure",
  153.         name"contact_failure",
  154.         methods: ["GET"]
  155.     )]
  156.     public function failure(
  157.         Request $request,
  158.         InquiryControllerService $service,
  159.         ContactConfigure $configure
  160.     ): Response {
  161.         $service->setContainer($this->container);
  162.         $contact = new Data();
  163.         if(!$form $service->loadAndGetForm(
  164.             $request,
  165.             $contact,
  166.             DataType::class,
  167.             self::SESSION_NAME
  168.         )) {
  169.             return $this->redirectToRoute("contact_complete");
  170.         }
  171.         $service->mailSend($configure"pardotFailure"$contact$form);
  172.         return $this->redirectToRoute("contact_complete");
  173.     }
  174.     #[Route(
  175.         path"/pardot_mock",
  176.         name"contact_pardot_mock",
  177.         methods: ["POST"]
  178.     )]
  179.     public function pardotMock(
  180.         Request $request,
  181.         LoggerInterface $logger
  182.     ): Response {
  183.         $logger->info('Contact pardot send: 'print_r($request->request->all(), true));
  184.         return $this->redirectToRoute("contact_failure");
  185.     }
  186.     #[Route(
  187.         path"/mock",
  188.         name"contact_mock",
  189.         methods: ["GET"]
  190.     )]
  191.     public function mock(
  192.         Request $request,
  193.         InquiryControllerService $service
  194.     ): Response {
  195.         $service->setContainer($this->container);
  196.         $contact $service->createMock(Data::class)
  197.             ->setName('田中太郎')
  198.             ->setKana('たなかたろう')
  199.             ->setPhone('052-325-3648')
  200.             ->setEmail("info@triple-e.jp")
  201.             ->setMessage('お問い合わせのローカルの動作テストです')
  202.             ;
  203.         $service->saveMock($request$contactDataType::class, self::SESSION_NAME);
  204.         return $this->redirectToRoute(self::INDEX_ROUTE);
  205.     }
  206. }