<?php
namespace App\Controller\Mvc;
use App\Entity\Recruit\Entry;
use App\Entity\Recruit\Inquiry;
use App\Event\Recruit\Inquiry\PostMailSendEvent;
use App\Event\Recruit\Inquiry\PostPersistEvent;
use App\Event\Recruit\Inquiry\PrePersistEvent;
use App\Form\Recruit\InquiryType;
use App\MailConfigure\Recruit\InquiryConfigure;
use App\Repository\Recruit\CategoryRepository;
use App\Repository\Recruit\InquiryRepository;
use App\Service\Entity\Recruit\EntryService;
use App\Service\InquiryControllerService;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route("/entry")]
class RecruitController extends AbstractController
{
private const SESSION_NAME = "recruit";
private const SESSION_DETAIL_ID = "recruit_detail_id";
public function __construct(
private readonly EntryService $entryService
) {}
private function getEntry(int $id): Entry
{
if(!$entry = $this->entryService->getEntryById($id)) {
throw $this->createNotFoundException("entry not found");
}
return $entry;
}
private function getEntryFromSession(Request $request): Entry
{
if(
!$request->getSession()->has(self::SESSION_DETAIL_ID) ||
!is_numeric($request->getSession()->get(self::SESSION_DETAIL_ID))
) {
throw $this->createNotFoundException("Session invalid");
}
return $this->getEntry($request->getSession()->get(self::SESSION_DETAIL_ID));
}
#[Route(path: "/", name: "recruit_index", methods: ["GET"])]
public function index(
Request $request,
CategoryRepository $categoryRepository,
EntryService $service
): Response
{
$service->setContainer($this->container);
$paginate = $service->getPagination($request);
return $this->render("pages/recruit/index.html.twig", [
"paginate" => $paginate,
"categories" => $categoryRepository->getCategoriesHaveEntry()
]);
}
#[Route(path: "/headline", name: "recruit_headline", methods: ["GET"])]
public function headline(
Request $request,
EntryService $service
): Response
{
$service->setContainer($this->container);
$paginate = $service->getPagination($request, 4);
return $this->render("pages/recruit/headline.html.twig", [
"paginate" => $paginate
]);
}
#[Route(path: "/{id}", name: "recruit_detail", requirements: ["id" => "\d+"], methods: ["GET"])]
public function detail(
Request $request,
InquiryControllerService $inquiryService,
int $id
): Response
{
$entry = $this->getEntry($id);
if(!$this->entryService->isEnableInquiry($entry)) {
return $this->render("pages/recruit/detail.html.twig", [
"entry" => $entry,
"form" => null,
"retry" => false
]);
}
$inquiryService->setContainer($this->container);
$inquiry = (new Inquiry())
->setEntry($entry)
;
$form = $inquiryService->prepareForm(
$request,
$inquiry,
self::SESSION_NAME,
InquiryType::class, [
"entry" => $entry
]
);
$request->getSession()->set(self::SESSION_DETAIL_ID, $entry->getId());
return $this->render("pages/recruit/detail.html.twig", [
"entry" => $entry,
"form" => $form->createView(),
"retry" => false
]);
}
#[Route(path: "/confirm", name: "recruit_confirm", methods: ["POST"])]
public function confirm(
Request $request,
InquiryControllerService $inquiryService,
InquiryRepository $inquiryRepository
): Response
{
$inquiryService->setContainer($this->container);
$entry = $this->getEntryFromSession($request);
$inquiry = (new Inquiry())
->setEntry($entry)
;
if(!$this->entryService->isEnableInquiry($entry)) {
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
$form = $inquiryService->getSubmittedForm(
$request,
$inquiry,
InquiryType::class,
[
"entry" => $entry
]
);
if(false === $inquiryService->formValidation($request, $inquiry, $form, $inquiryRepository)) {
return $this->render("pages/recruit/detail.html.twig", [
"entry" => $entry,
"form" => $form->createView(),
"retry" => true
]);
}
return $this->render("pages/recruit/confirm.html.twig", [
"entry" => $entry,
"inquiry" => $inquiry,
"form" => $form->createView(),
"confirmForm" => $inquiryService
->saveAndGetConfirmForm($request, $form, self::SESSION_NAME)
->createView()
]);
}
#[Route(path: "/send", name: "recruit_send", methods: ["POST"])]
public function send(
Request $request,
InquiryControllerService $inquiryService,
InquiryRepository $inquiryRepository,
InquiryConfigure $configure,
EventDispatcherInterface $eventDispatcher
): Response
{
$inquiryService->setContainer($this->container);
$entry = $this->getEntryFromSession($request);
if(!$inquiryService->handleConfirmForm($request)) {
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
if(!$this->entryService->isEnableInquiry($entry)) {
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
$inquiry = (new Inquiry())
->setEntry($entry)
;
if(!$form = $inquiryService->loadAndGetForm(
$request,
$inquiry,
InquiryType::class,
self::SESSION_NAME,
[
"entry" => $entry
]
)) {
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
if(!$inquiryService->formValidation($request, $inquiry, $form, $inquiryRepository)) {
return $this->render("pages/recruit/detail.html.twig", [
"form" => $inquiryService->createRetryForm(
InquiryType::class,
$inquiry,
"送信時にエラーが発生しました",
[
"entry" => $entry
]
)->createView(),
"retry" => true,
"entry" => $entry
]);
}
$preEvent = new PrePersistEvent($inquiry, $form);
$eventDispatcher->dispatch($preEvent, "recruit_inquiry.prePersist");
$inquiryRepository->add($inquiry);
$postEvent = new PostPersistEvent($inquiry, $form);
$eventDispatcher->dispatch($postEvent, "recruit_inquiry.postPersist");
$sendSuccess = true;
if(!$inquiryService->mailSend($configure, "client", $inquiry, $form, [
"entry" => $entry
])) {
$sendSuccess = false;
}
if(!$inquiryService->mailSend($configure, "reply", $inquiry, $form, [
"entry" => $entry
])) {
$sendSuccess = false;
}
if(false === $sendSuccess) {
return $this->render("pages/recruit/detail.html.twig", [
"form" => $inquiryService->createRetryForm(
InquiryType::class,
$inquiry,
"送信処理に失敗しました",
[
"entry" => $entry
]
)->createView(),
"retry" => true,
"entry" => $entry
]);
}
$postSendEvent = new PostMailSendEvent($inquiry, $form);
$eventDispatcher->dispatch($postSendEvent, "recruit_inquiry.postMailSend");
// pardot送信などの場合ここでHTMLレンダリング
// return $this->render("pages/recruit/send.html.twig", [
// "inquiry" => $inquiry,
// "entry" => $entry
// ]);
return $this->redirectToRoute("recruit_complete");
}
#[Route(path: "/complete", name: "recruit_complete", methods: ["GET"])]
public function complete(
Request $request,
InquiryControllerService $inquiryService
): Response
{
$inquiryService->setContainer($this->container);
$entry = $this->getEntryFromSession($request);
$inquiry = (new Inquiry())
->setEntry($entry)
;
if(!$form = $inquiryService->loadAndGetForm(
$request,
$inquiry,
InquiryType::class,
self::SESSION_NAME,
[
"entry" => $entry
]
)) {
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
$request->getSession()->remove(self::SESSION_NAME);
$request->getSession()->remove(self::SESSION_DETAIL_ID);
return $this->render("pages/recruit/complete.html.twig", [
"entry" => $entry,
"form" => $form->createView()
]);
}
#[Route(path: "/failure", name: "recruit_failure", methods: ["GET"])]
public function failure(
Request $request,
InquiryControllerService $inquiryService,
InquiryConfigure $configure
): Response
{
$inquiryService->setContainer($this->container);
$entry = $this->getEntryFromSession($request);
$inquiry = (new Inquiry())
->setEntry($entry)
;
if(!$form = $inquiryService->loadAndGetForm(
$request,
$inquiry,
InquiryType::class,
self::SESSION_NAME,
[
"entry" => $entry
]
)) {
return $this->redirectToRoute("recruit_complete", [
"id" => $entry->getId()
]);
}
$inquiryService->mailSend($configure, "pardotFailure", $inquiry, $form);
return $this->redirectToRoute("recruit_complete");
}
#[Route(path: "/pardot_mock", name: "recruit_pardot_mock", methods: ["POST"])]
public function pardotMock(
Request $request,
LoggerInterface $logger
): Response
{
$logger->info("採用エントリー pardot send:" .print_r($request->request->all(), true));
return $this->redirectToRoute("recruit_failure");
}
#[Route(
path: "/mock/{id}",
name: "recruit_mock",
requirements: ["id" => "\d+"],
methods: ["GET"]
)]
public function mock(
Request $request,
InquiryControllerService $inquiryService,
int $id
): Response
{
$inquiryService->setContainer($this->container);
$entry = $this->getEntry($id);
$inquiry = $inquiryService->createMock(Inquiry::class)
->setName('田中太郎')
->setKana('たなかたろう')
->setPhone('052-325-3648')
->setEmail("info@triple-e.jp")
->setMessage('採用エントリーのローカルの動作テストです')
;
$inquiryService->saveMock($request, $inquiry, InquiryType::class, self::SESSION_NAME, [
"entry" => $entry
]);
return $this->redirectToRoute("recruit_detail", [
"id" => $entry->getId()
]);
}
}