src/Controller/HomeController.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
  5. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
  6. use ReCaptcha\ReCaptcha;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\Mime\Email;
  12. use App\Entity\Recharge;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  16. use Symfony\Component\Validator\Validator\ValidatorInterface;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. use Symfony\Component\Validator\Constraints as Assert;
  19. class HomeController extends AbstractController
  20. {
  21.     private EntityManagerInterface $em;
  22.     private MailerInterface $mailer;
  23.     private TranslatorInterface $translator;
  24.     public function __construct(EntityManagerInterface $emMailerInterface $mailerTranslatorInterface $translator)
  25.     {
  26.         $this->em $em;
  27.         $this->mailer $mailer;
  28.         $this->translator $translator;
  29.     }
  30.     
  31.     #[Route(path'/'name'app_home')]
  32.     public function index(): Response
  33.     {
  34.         return $this->render('frontend/index.html.twig', []);
  35.     }
  36.     /**
  37.      * @throws TransportExceptionInterface
  38.      */
  39.     #[Route(path'/form_submit'name'app_home_submit'methods: ['POST'])]
  40.     public function postForm(Request $requestReCaptcha3Validator $recaptcha3ValidatorValidatorInterface $validator): JsonResponse
  41.     {
  42.         $data json_decode($request->getContent(), true);
  43.         $recaptchaToken $data['recaptcha_token'] ?? null;
  44.         $violations $validator->validate($recaptchaToken, [
  45.             new Assert\NotBlank(['message' => 'Token manquant.']),
  46.             new Recaptcha3(['message' => 'Vérification échouée.']),
  47.         ]);
  48.         if (count($violations) > 0) {
  49.             return new JsonResponse([
  50.                 'error' => "Erreur survenue Recaptcha",
  51.                 'messages' => iterator_to_array($violations),
  52.             ], 400);
  53.         }
  54.         $nombreCodes = isset($data['nombre_codes']) ? (int)$data['nombre_codes'] : 0;
  55.         $codes = [];
  56.         for ($i 1$i <= $nombreCodes$i++) {
  57.             $codeKey 'codeRecharge' $i;
  58.             if (isset($data[$codeKey])) {
  59.                 $codes[] = $data[$codeKey];
  60.             }
  61.         }
  62.         $recharge = new Recharge();
  63.         $recharge->setType($data['recharge']);
  64.         $recharge->setMontant($data['montant']);
  65.         $recharge->setDevise($data['devise']);
  66.         $recharge->setEmail($data['email']);
  67.         $recharge->setCode1(implode(', '$codes));
  68.         $recharge->setCreatedAt(new \DateTimeImmutable());
  69.         $this->em->persist($recharge);
  70.         // Contenu de l'email en HTML
  71.         $emailContent "
  72.             <html>
  73.                 <head>
  74.                     <style>
  75.                         body {
  76.                             font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  77.                             line-height: 1.6;
  78.                             background-color: #f4f4f9;
  79.                             color: #444;
  80.                             margin: 0;
  81.                             padding: 0;
  82.                         }
  83.                         .email-container {
  84.                             max-width: 600px;
  85.                             margin: 40px auto;
  86.                             background-color: #ffffff;
  87.                             padding: 30px;
  88.                             border-radius: 12px;
  89.                             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
  90.                         }
  91.                         .email-header {
  92.                             text-align: center;
  93.                             background-color: #f0ecf9;
  94.                             padding: 25px;
  95.                             border-radius: 10px 10px 0 0;
  96.                         }
  97.                         .email-header h2 {
  98.                             margin: 0;
  99.                             font-size: 22px;
  100.                             color: #4a2e8e;
  101.                         }
  102.                         .email-body {
  103.                             padding: 20px;
  104.                         }
  105.                         .email-body p {
  106.                             margin: 12px 0;
  107.                             font-size: 15px;
  108.                         }
  109.                         .email-body table {
  110.                             width: 100%;
  111.                             border-collapse: collapse;
  112.                             margin-top: 20px;
  113.                             background-color: #fafafa;
  114.                             border-radius: 8px;
  115.                             overflow: hidden;
  116.                         }
  117.                         .email-body th, .email-body td {
  118.                             padding: 12px 15px;
  119.                             text-align: left;
  120.                             border-bottom: 1px solid #e0e0e0;
  121.                         }
  122.                         .email-body th {
  123.                             background-color: #f6f2fc;
  124.                             color: #4a2e8e;
  125.                             font-weight: 600;
  126.                         }
  127.                         .email-body td {
  128.                             color: #333;
  129.                         }
  130.                         .email-footer {
  131.                             text-align: center;
  132.                             font-size: 13px;
  133.                             color: #888;
  134.                             margin-top: 30px;
  135.                         }
  136.                     </style>
  137.                 </head>
  138.                 <body>
  139.                     <div class='email-container'>
  140.                         <div class='email-header'>
  141.                             <h2>" $this->translator->trans('email.verification_successful', [], 'email') . "</h2>
  142.                         </div>
  143.                         <div class='email-body'>
  144.                             <p>" $this->translator->trans('email.hello', [], 'email') . "</p>
  145.                             <p>" $this->translator->trans('email.success_message', [], 'email') . "</p>
  146.                             <table>
  147.                                 <tr>
  148.                                     <th>" $this->translator->trans('email.recharge_type', [], 'email') . "</th>
  149.                                     <td>{$recharge->getType()}</td>
  150.                                 </tr>
  151.                                 <tr>
  152.                                     <th>" $this->translator->trans('email.amount', [], 'email') . "</th>
  153.                                     <td>{$recharge->getMontant()} {$recharge->getDevise()}</td>
  154.                                 </tr>
  155.                                 <tr>
  156.                                     <th>" $this->translator->trans('email.recharge_codes', [], 'email') . "</th>
  157.                                     <td>" implode(', '$codes) . "</td>
  158.                                 </tr>
  159.                             </table>
  160.                             <p>" $this->translator->trans('email.thanks_message', [], 'email') . "</p>
  161.                             <p>" $this->translator->trans('email.thank_you', [], 'email') . "</p>
  162.                             <p>" $this->translator->trans('email.regards', [], 'email') . "</p>
  163.                             <p><strong>" $this->translator->trans('email.team', [], 'email') . "</strong></p>
  164.                         </div>
  165.                         <div class='email-footer'>
  166.                             <p>" $this->translator->trans('email.footer', ['%year%' => date('Y')], 'email') . "</p>
  167.                         </div>
  168.                     </div>
  169.                 </body>
  170.             </html>
  171.             ";
  172.         $email = (new Email())
  173.             ->from('no-reply@voucher.giftcard-ticket.com')
  174.             ->to($data['email'])
  175.             ->subject($this->translator->trans('email.verif', [], 'email'))
  176.             ->html($emailContent); // Utilisation de html() au lieu de text()
  177.         $this->mailer->send($email);
  178.         $this->em->flush();
  179.         return new JsonResponse(['success' => true]);
  180.     }
  181. }