src/EventListener/RegistrationListener.php line 95

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\Company;
  4. use App\Messaging\TranslationService;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Gedmo\Translatable\Entity\Repository\TranslationRepository;
  7. use Gedmo\Translatable\Entity\Translation;
  8. use Hashids\Hashids;
  9. use Roothirsch\CoreBundle\Entity\User;
  10. use Roothirsch\CoreBundle\Messaging\MessagingService;
  11. use Roothirsch\CoreBundle\Repository\CompanyRepository;
  12. use Roothirsch\CoreBundle\Security\Event\RegistrationCompletedEvent;
  13. use Roothirsch\CoreBundle\Security\Event\RegistrationTokenCreatedEvent;
  14. use Roothirsch\CoreBundle\Site\Repository\SiteRepository;
  15. use Roothirsch\CoreBundle\Site\SiteProvider;
  16. use Roothirsch\CoreBundle\Site\SiteSetting\Resolver;
  17. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Symfony\Component\PropertyAccess\PropertyAccess;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\Routing\RouterInterface;
  24. class RegistrationListener implements EventSubscriberInterface
  25. {
  26. /** @var CompanyRepository */
  27. private $companyRepository;
  28. /** @var MessagingService */
  29. private $messaging;
  30. /** @var RequestStack */
  31. private $requestStack;
  32. /** @var \Roothirsch\CoreBundle\Site\Entity\Site */
  33. private $site;
  34. /** @var SiteProvider */
  35. private $siteProvider;
  36. private $entityManager;
  37. private $translationService;
  38. /** @var Resolver Resolver */
  39. private $resolver;
  40. /**
  41. * @param CompanyRepository $companyRepository
  42. */
  43. public function __construct(
  44. EntityManagerInterface $entityManager,
  45. CompanyRepository $companyRepository,
  46. MessagingService $messaging,
  47. RequestStack $requestStack,
  48. SiteProvider $siteProvider,
  49. TranslationService $translationService,
  50. Resolver $resolver
  51. )
  52. {
  53. $this->entityManager = $entityManager;
  54. $this->translationService = $translationService;
  55. $this->site = $siteProvider->getSite();
  56. $this->siteProvider = $siteProvider;
  57. $this->companyRepository = $companyRepository;
  58. $this->messaging = $messaging;
  59. $this->requestStack = $requestStack;
  60. $this->resolver = $resolver;
  61. }
  62. public static function getSubscribedEvents()
  63. {
  64. return [
  65. RegistrationTokenCreatedEvent::EVENT => "onTokenCreatedEvent",
  66. RegistrationCompletedEvent::EVENT => "onRegistrationCompletedEvent"
  67. ];
  68. }
  69. public function onTokenCreatedEvent(RegistrationTokenCreatedEvent $event)
  70. {
  71. $email = $event->getEmail('user_token');
  72. $context = $email->getContext();
  73. $context['siteTitle'] = $this->siteProvider->getTitle();
  74. $email
  75. ->subject(
  76. $this->translationService->translate('email.registration.user_email', 'Ihre Registrierung bei {siteTitle}', $context)
  77. )
  78. ->context($context);
  79. $event->setEmail("user_token", $email);
  80. }
  81. public function onRegistrationCompletedEvent(RegistrationCompletedEvent $event)
  82. {
  83. $user = $event->getUser();
  84. $recipients = $this->getRecipients($user);
  85. $message = new TemplatedEmail();
  86. $message->from($this->site->getSetting('[mailer][from]') ?? 'noreply@brunex.de');
  87. $message->subject(
  88. $this->translationService->translate('email.registration.contact_person', '{siteTitle} Registrierung', ['siteTitle' => $this->siteProvider->getTitle()])
  89. );
  90. foreach ($recipients as $recipient) {
  91. if($this->resolver->canResolve($recipient)){
  92. $recipient = $this->resolver->resolve($recipient);
  93. if(!$recipient) {
  94. continue;
  95. }
  96. }
  97. try {
  98. $message->addTo($recipient);
  99. } catch (\Exception $exception){
  100. // ignoring invalid emails.
  101. continue;
  102. }
  103. }
  104. $message->htmlTemplate('security/registration/email_registration_confirm.html.twig');
  105. $message->context([
  106. 'user' => $user,
  107. 'distributor' => $this->distributor($event->getRequest())
  108. ]);
  109. $event->addEmail('contactperson_notify', $message);
  110. }
  111. private function getRecipients(User $user)
  112. {
  113. $recipients = explode(',', $_ENV['REGISTRATION_RECIPIENTS']);
  114. $key = "[registration][recipients]";
  115. if($this->site->hasSetting($key)) {
  116. $recipients = array_values($this->site->getSetting($key));
  117. }
  118. $index = array_search('#CONTACT_PERSON', $recipients);
  119. if($index !== FALSE){
  120. if ($user->getContact()) {
  121. $recipients[$index] = $user->getContact()->getEmail();
  122. }
  123. }
  124. return array_filter($recipients, function ($email) {
  125. return !!$email;
  126. });
  127. }
  128. private function distributor(Request $request){
  129. if ($request->cookies->has('_d')) {
  130. $hashids = new Hashids();
  131. $distributorId = current($hashids->decode($request->cookies->get('_d')));
  132. $distributor = $this->companyRepository->find($distributorId);
  133. if ($distributor) {
  134. return $distributor;
  135. }
  136. }
  137. return NULL;
  138. }
  139. }