src/Controller/CartController.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Component\Cart;
  4. use App\Component\CartService;
  5. use App\Component\RefererTrait;
  6. use App\Entity\CartItem;
  7. use App\Entity\Invoice;
  8. use App\Entity\InvoiceDetail;
  9. use App\Entity\Menu;
  10. use App\Entity\Order;
  11. use App\Entity\OrderMenu;
  12. use App\Entity\Payment;
  13. use App\Entity\PaymentMethod;
  14. use App\Entity\User;
  15. use App\Form\Type\CartAddItemType;
  16. use App\Form\Type\CartUpdateQuantityType;
  17. use App\GmoPg\Exception\HasErrorException;
  18. use App\GmoPg\Exception\RequestException;
  19. use App\GmoPg\Form\Type\CreditCardType;
  20. use App\GmoPg\GmoPgCreditCard;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Http\Discovery\Exception\NotFoundException;
  23. use PascalDeVink\ShortUuid\ShortUuid;
  24. use Ramsey\Uuid\Uuid;
  25. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  26. use Symfony\Component\Form\Extension\Core\Type\FormType;
  27. use Symfony\Component\HttpFoundation\JsonResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Security\Core\Security;
  32. class CartController extends AbstractController
  33. {
  34.     use RefererTrait;
  35.     /**
  36.      * @Route("/cart", name="cart_index")
  37.      *
  38.      * @param EntityManagerInterface $em
  39.      * @return Response
  40.      */
  41.     public function index(Request $requestEntityManagerInterface $emSecurity $securityCartService $cartServiceGmoPgCreditCard $gmoPgCreditCard)
  42.     {
  43.         $user $security->getToken()->getUser();
  44.         $form $this->createForm(FormType::class);
  45.         $form->handleRequest($request);
  46.         if ($form->isSubmitted() && $form->isValid()) {
  47.             // 支払処理
  48.             /* @var User $user */
  49.             if (! $user->getPrimaryPaymentMethod()) {
  50.                 $this->addFlash('user-warning''お支払方法が設定されていません。');
  51.                 return $this->redirectToRoute('cart_index');
  52.             }
  53.             $em->beginTransaction();
  54.             $result $cartService->checkout($user);
  55.             if (! ($result instanceof Order)) {
  56.                 $this->addFlash('user-warning'$result);
  57.                 return $this->redirectToRoute('cart_index');
  58.             }
  59.             $em->commit();
  60.             return $this->redirectToRoute('cart_checkout', ['order' => $result->getId()]);
  61.         }
  62.         $user $this->getUser();
  63.         $cart $em->getRepository('App:Cart')->getAvailableCartByUser($user);
  64.         return $this->render('index/cart/index.html.twig', [
  65.             'user' => $user,
  66.             'cart' => $cart,
  67.             'form' => $form->createView(),
  68.         ]);
  69.     }
  70.     /**
  71.      * @Route("/cart/checkout/{order}", name="cart_checkout")
  72.      *
  73.      */
  74.     public function cartDone(Request $requestEntityManagerInterface $emOrder $order)
  75.     {
  76.         $user $this->getUser();
  77.         if ($order->getUser()->getId() != $user->getId()) {
  78.             throw $this->createAccessDeniedException();
  79.         }
  80.         return $this->render('index/cart/checkout.html.twig', [
  81.             'user' => $user,
  82.             'order' => $order,
  83.         ]);
  84.     }
  85.     /**
  86.      * @Route("/cart/add/{menu}", name="cart_add")
  87.      *
  88.      * @param Request $request
  89.      * @param EntityManagerInterface $em
  90.      * @param Security $security
  91.      * @param Menu $menu
  92.      * @param CartService $cartService
  93.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  94.      * @throws \Psr\Container\ContainerExceptionInterface
  95.      * @throws \Psr\Container\NotFoundExceptionInterface
  96.      */
  97.     public function add(Request $requestEntityManagerInterface $emSecurity $securityMenu $menuCartService $cartService)
  98.     {
  99.         $form $this->createForm(CartAddItemType::class);
  100.         $form->handleRequest($request);
  101.         if ($form->isSubmitted()) {
  102.             if ($this->isCsrfTokenValid('add-item'$request->request->get('token'))) {
  103.                 $data $form->getData();
  104.                 $quantity 1;
  105.                 if ($data['quantity']) {
  106.                     $quantity $data['quantity'];
  107.                 }
  108. //                $this->cartFactory->addItem($menu, $quantity);
  109. //                $this->addFlash('success', 'カートに'. $menu->getName(). 'を追加しました。');
  110.                 $user $this->getUser();
  111.                 $toCart false;
  112.                 if ($user) {
  113.                     $token $security->getToken();
  114.                     $_user $token->getUser();
  115.                     if ($_user instanceof User) {
  116.                         $toCart true;
  117.                     }
  118.                 }
  119.                 if (! $toCart) {
  120.                     // 未ログインなのでログイン画面にリダイレクト
  121.                     // 戻りURL情報をリファラから取得
  122.                     $params $this->getRefererParams();
  123.                     // 登録後にカートに商品を追加するためセッションに保存
  124.                     $this->container->get('session')->set('auth_adding_item', [
  125.                         'params' => $params,
  126.                         'menuId' => $menu->getId(),
  127.                         'quantity' => $quantity,
  128.                     ]);
  129.                     return $this->redirectToRoute('user_register');
  130.                 } else {
  131.                     $cartService->addCartItem($user$menu$quantity);
  132.                     $em->flush();
  133.                     $this->addFlash('user-success''カートに'$menu->getName(). 'を追加しました。');
  134.                     $this->container->get('session')->remove('auth_adding_item');
  135.                 }
  136.             }
  137.         }
  138.         return $this->redirectToRoute('shop', [
  139.             'id' => $menu->getShop()->getId(),
  140.         ]);
  141.     }
  142.     /**
  143.      * @Route("/cart/update-quantity", name="cart_update_quantity")
  144.      *
  145.      * @param Request $request
  146.      * @param EntityManagerInterface $em
  147.      * @param Security $security
  148.      * @param Menu $menu
  149.      * @param CartService $cartService
  150.      * @return JsonResponse
  151.      * @throws \Psr\Container\ContainerExceptionInterface
  152.      * @throws \Psr\Container\NotFoundExceptionInterface
  153.      */
  154.     public function updateQuantity(Request $requestEntityManagerInterface $emSecurity $securityCartService $cartService)
  155.     {
  156.         $form $this->createForm(CartUpdateQuantityType::class);
  157.         $form->handleRequest($request);
  158.         $cartItem null;
  159.         if ($form->isSubmitted()) {
  160.             if ($this->isCsrfTokenValid('cart_update_quantity'$request->request->get('token'))) {
  161.                 $data $form->getData();
  162.                 $user $security->getToken()->getUser();
  163.                 $cartItem $em->getRepository('App:CartItem')->find($data['cartItem']);
  164.                 $cartService->updateQuantity($user$cartItem->getMenu(), $data['quantity']);
  165.                 $em->flush();
  166.             }
  167.         }
  168.         return new JsonResponse();
  169.     }
  170.     /**
  171.      * @Route("/cart/payment-method", name="cart_payment_method")
  172.      *
  173.      * @param Request $request
  174.      * @param EntityManagerInterface $em
  175.      * @param Security $security
  176.      * @param Menu $menu
  177.      * @param CartService $cartService
  178.      * @return Response
  179.      * @throws \Psr\Container\ContainerExceptionInterface
  180.      * @throws \Psr\Container\NotFoundExceptionInterface
  181.      */
  182.     public function paymentMethod(Request $requestEntityManagerInterface $emSecurity $securityCartService $cartService)
  183.     {
  184.         $user $this->getUser();
  185.         return $this->render('index/cart/payment_method/index.html.twig', [
  186.             'user' => $user,
  187.         ]);
  188.     }
  189.     /**
  190.      * @Route("/cart/payment-method/add", name="cart_payment_method_add")
  191.      *
  192.      * @param Request $request
  193.      * @param EntityManagerInterface $em
  194.      * @param Security $security
  195.      * @param Menu $menu
  196.      * @param CartService $cartService
  197.      * @return Response
  198.      * @throws \Psr\Container\ContainerExceptionInterface
  199.      * @throws \Psr\Container\NotFoundExceptionInterface
  200.      */
  201.     public function paymentMethodAdd(Request $requestEntityManagerInterface $emSecurity $securityCartService $cartServiceGmoPgCreditCard $gmoPgCreditCard)
  202.     {
  203.         $user $this->getUser();
  204.         $form $this->createForm(CreditCardType::class);
  205.         $form->handleRequest($request);
  206.         if ($form->isSubmitted() && $form->isValid()) {
  207.             $data $form->getData();
  208.             $em->beginTransaction();
  209.             // 既存の支払方法を優先ではなくす
  210.             foreach ($user->getPaymentMethods() as $paymentMethod) {
  211.                 $paymentMethod->setIsPrimary(false);
  212.                 $em->persist($paymentMethod);
  213.             }
  214.             try {
  215.                 $gmoPgCreditCard->saveMember($user);
  216.                 // カード登録
  217.                 $paymentMethod = new PaymentMethod();
  218.                 $paymentMethod->setUser($user);
  219.                 $paymentMethod->setIsPrimary(true);
  220.                 $paymentMethod->setType(PaymentMethod::TYPE_CREDIT_CARD);
  221.                 $em->persist($paymentMethod);
  222.                 $creditCard $gmoPgCreditCard->saveCard($paymentMethod$data['credit_card_token']);
  223.                 $em->persist($creditCard);
  224.                 $paymentMethod->setCreditCard($creditCard);
  225.                 $em->persist($paymentMethod);
  226.             } catch (HasErrorException $e) {
  227.                 $messages $gmoPgCreditCard->convertErrorCodeToMessage($e->getErrors());
  228.                 $this->addFlash('user-danger'"クレジットカードの登録に失敗しました。" implode(""$messages) . '(エラーコード:' implode(','$e->getErrors()) . ')');
  229.                 return $this->redirectToRoute('cart_payment_method_add');
  230.             } catch (RequestException $e) {
  231.                 $this->addFlash('user-danger''クレジットカード会社との通信に失敗しました。恐れ入りますが、しばらく待ってから再度入力をお願いいたします。(エラーコード:' .$e->getCode(). ')');
  232.                 return $this->redirectToRoute('cart_payment_method_add');
  233.             } catch (\Exception $e) {
  234.                 $this->addFlash('user-danger''クレジットカードの登録に失敗しました。恐れ入りますが、しばらく待ってから再度入力をお願いいたします。(エラーコード:' .$e->getCode(). ')');
  235.                 return $this->redirectToRoute('cart_payment_method_add');
  236.             }
  237.             $em->persist($user);
  238.             $em->flush();
  239.             $em->commit();
  240.             $this->addFlash('user-success''お支払い情報を保存しました');
  241.             return $this->redirectToRoute('cart_index');
  242.         }
  243.         return $this->render('index/cart/payment_method/add.html.twig', [
  244.             'form' => $form->createView(),
  245.             'user' => $user,
  246.         ]);
  247.     }
  248. }