src/Controller/ContactController.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Entity\Contact;
  5. use App\Form\ContactType;
  6. use App\Repository\ContactRepository;
  7. use App\Service\BrevoSmsService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\Mime\Email;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. class ContactController extends AbstractController
  16. {
  17.   /**
  18.    * @Route("/contact", name="contact")
  19.    */
  20.   public function contact(
  21.     Request $request,
  22.     MailerInterface $mailer,
  23.     EntityManagerInterface $entityManager,
  24.     ContactRepository $contactRepository,
  25.     BrevoSmsService $brevoSmsService
  26.   ): Response {
  27.     $contact = new Contact();
  28.     $loggedInUser $this->getUser();
  29.     if ($loggedInUser instanceof User) {
  30.       $contact->setUser($loggedInUser);
  31.       // Si les champs ne sont pas dans le form, ils doivent être remplis ici
  32.       // pour la vérification de doublon et pour la persistance.
  33.       if (method_exists($loggedInUser'getFirstname')) {
  34.         $contact->setFirstname($loggedInUser->getFirstname());
  35.       }
  36.       if (method_exists($loggedInUser'getLastname')) {
  37.         $contact->setLastname($loggedInUser->getLastname());
  38.       }
  39.       if (method_exists($loggedInUser'getEmail')) {
  40.         $contact->setEmail($loggedInUser->getEmail());
  41.       }
  42.     }
  43.     $form $this->createForm(ContactType::class, $contact);
  44.     $form->handleRequest($request);
  45.     if ($form->isSubmitted() && $form->isValid()) {
  46.       // Le $contact est maintenant hydraté avec les données du formulaire (ou pré-rempli)
  47.       // Vérification du message dupliqué AVANT de persister
  48.       $userToCheck $contact->getUser();
  49.       $emailToCheck = ($userToCheck === null) ? $contact->getEmail() : null// Email seulement si invité
  50.       if ($contact->getMessage() === null || ($userToCheck === null && $emailToCheck === null)) {
  51.         // Cas où le message est vide ou informations d'identification manquantes (ne devrait pas arriver avec la validation)
  52.         $this->addFlash('error''Une erreur est survenue. Veuillez vérifier votre saisie.');
  53.       } elseif ($contactRepository->hasExistingIdenticalRequest($contact->getMessage(), $userToCheck$emailToCheck)) {
  54.         $this->addFlash('warning''Un message identique a déjà été soumis. Si vous avez une nouvelle demande, veuillez modifier votre message.');
  55.         // Renvoyer le formulaire avec les données saisies et le message d'erreur
  56.         // Ne pas rediriger pour que l'utilisateur voie son message et l'avertissement.
  57.         return $this->render('contact/form.html.twig', [
  58.           'contactForm' => $form->createView(),
  59.         ]);
  60.       } else {
  61.         // Pas de doublon, on continue
  62.         $entityManager->persist($contact);
  63.         $entityManager->flush();
  64.         $user $contact->getUser();
  65.         if ($user instanceof User) {
  66.           $emailForStan trim((string) ($user->getEmailPro() ?? '')) !== ''
  67.             trim((string) $user->getEmailPro())
  68.             : (string) $contact->getEmail();
  69.           $phoneLine trim((string) ($user->getPhone() ?? '')) !== ''
  70.             trim((string) $user->getPhone())
  71.             : 'non renseigné';
  72.         } else {
  73.           $emailForStan = (string) $contact->getEmail();
  74.           $phoneLine 'non renseigné';
  75.         }
  76.         $supportEmailTo = (string) $this->getParameter('support_email');
  77.         $emailContent "Nouvelle demande de contact reçue :\n\n";
  78.         if ($user instanceof User) {
  79.           $emailContent .= "Utilisateur connecté: ID " $user->getId() . "\n";
  80.         }
  81.         $emailContent .= "Prénom: " $contact->getFirstname() . "\n";
  82.         $emailContent .= "Nom: " $contact->getLastname() . "\n";
  83.         $emailContent .= "Email: " $emailForStan "\n";
  84.         $emailContent .= "Téléphone: " $phoneLine "\n";
  85.         $emailContent .= "Message:\n" $contact->getMessage() . "\n\n";
  86.         $emailContent .= "Envoyé le: " $contact->getCreatedAt()->format('d/m/Y H:i:s');
  87.         $mail = (new Email())
  88.           ->from($this->getParameter('mailer_from'))
  89.           ->to($supportEmailTo)
  90.           ->replyTo($emailForStan)
  91.           ->subject('Nouvelle demande de contact - ID: ' $contact->getId())
  92.           ->text($emailContent);
  93.         try {
  94.           $mailer->send($mail);
  95.           $supportSmsNumber = (string) $this->getParameter('support_sms_number');
  96.           if ($supportSmsNumber !== '') {
  97.             $smsContent 'Bambboo Support: Nouvelle demande #' $contact->getId();
  98.             $extrait mb_substr($contact->getMessage(), 060);
  99.             if (mb_strlen($contact->getMessage()) > 60) {
  100.               $extrait .= '…';
  101.             }
  102.             $smsContent .= ' - ' $extrait;
  103.             $brevoSmsService->send($supportSmsNumber$smsContent'TICKET-BAM');
  104.           }
  105.           $this->addFlash('success''Votre message a bien été envoyé et enregistré. Nous vous répondrons bientôt !');
  106.         } catch (\Symfony\Component\Mailer\Exception\TransportExceptionInterface $e) {
  107.           $this->addFlash('warning''Votre message a été enregistré, mais une erreur est survenue lors de l\'envoi de l\'email de notification. Erreur: ' $e->getMessage());
  108.         }
  109.         return $this->redirectToRoute('contact'); // Redirection après succès
  110.       }
  111.     }
  112.     return $this->render('contact/form.html.twig', [
  113.       'contactForm' => $form->createView(),
  114.     ]);
  115.   }
  116. }