src/EventListener/PagesAndRouteUpdateCommandListener.php line 75

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Controller\Page\ApplicantController;
  4. use App\Controller\Page\BlogPostController;
  5. use App\Controller\Page\BlogPostsController;
  6. use App\Controller\Page\CompaniesController;
  7. use App\Controller\Page\CompanyController;
  8. use App\Controller\Page\ContactController;
  9. use App\Controller\Page\EmployeeController;
  10. use App\Controller\Page\EventController;
  11. use App\Controller\Page\EventRegistrationController;
  12. use App\Controller\Page\EventsController;
  13. use App\Controller\Page\JobAlertController;
  14. use App\Controller\Page\NewsletterController;
  15. use App\Controller\Page\OrderController;
  16. use App\Controller\Page\ProductController;
  17. use App\Controller\Page\ProductsController;
  18. use App\Controller\Page\SearchController;
  19. use App\Controller\Page\TestimonialController;
  20. use App\Controller\Page\VacanciesController;
  21. use App\Controller\Page\VacancyController;
  22. use App\Entity\Page;
  23. use App\Event\SiteUpdateEvent;
  24. use Doctrine\DBAL\Exception as DBALException;
  25. use Doctrine\ORM\EntityManagerInterface;
  26. class PagesAndRouteUpdateCommandListener
  27. {
  28.     /**
  29.      * @var EntityManagerInterface
  30.      */
  31.     private $entityManager;
  32.     private $pageControllerMapping = [
  33.         'ContactBundle:Pages/Default:index' => ContactController::class.':indexAction',
  34.         'ContactBundle:Pages/Default:thank' => ContactController::class.':thankAction',
  35.         'VacancyBundle:Page/Vacancies:index' => VacanciesController::class.':indexAction',
  36.         'VacancyBundle:Page/Vacancy:detail' => VacancyController::class.':detailAction',
  37.         'CompanyBundle:Page/Companies:index' => CompaniesController::class.':indexAction',
  38.         'CompanyBundle:Page/Company:detail' => CompanyController::class.':detailAction',
  39.         'ApplicantBundle:Default:form' => ApplicantController::class.':formAction',
  40.         'ApplicantBundle:Default:thanks' => ApplicantController::class.':thanksAction',
  41.         'JobAlertBundle:Pages/JobAlert:index' => JobAlertController::class.':indexAction',
  42.         'JobAlertBundle:Pages/JobAlert:thanks' => JobAlertController::class.':thanksAction',
  43.         'ProductBundle:Page/Products:index' => ProductsController::class.':indexAction',
  44.         'ProductBundle:Page/Product:detail' => ProductController::class.':detailAction',
  45.         'BlogBundle:Page/BlogPosts:index' => BlogPostsController::class.':indexAction',
  46.         'BlogBundle:Page/BlogPost:detail' => BlogPostController::class.':detailAction',
  47.         'OrderBundle:Pages/Order:thanksInvoice' => OrderController::class.':thanksInvoice',
  48.         'OrderBundle:Pages/Order:requestSample' => OrderController::class.':requestSampleAction',
  49.         'OrderBundle:Pages/Order:thanksSample' => OrderController::class.':thanksSampleAction',
  50.         'SearchBundle:Pages/Search:search' => SearchController::class.':searchAction',
  51.         'NewsletterBundle:Pages/Newsletter:subscribe' => NewsletterController::class.':subscribeAction',
  52.         'EventBundle:Pages/Events:index' => EventsController::class.':indexAction',
  53.         'EventBundle:Pages/Event:detail' => EventController::class.':detailAction',
  54.         'EventBundle:Pages/Registration:registration' => EventRegistrationController::class.':registrationAction',
  55.         'EventBundle:Pages/Registration:thanksRegistration' => EventRegistrationController::class.':thanksRegistrationAction',
  56.         'TestimonialBundle:Pages/Testimonial:detail' => TestimonialController::class.':detailAction',
  57.         'EmployeeBundle:Pages/Employee:detail' => EmployeeController::class.':detailAction',
  58.     ];
  59.     /**
  60.      * PageAndRouteUpdateListener constructor.
  61.      */
  62.     public function __construct(EntityManagerInterface $entityManager)
  63.     {
  64.         $this->entityManager $entityManager;
  65.     }
  66.     /**
  67.      * @throws DBALException
  68.      */
  69.     public function updatePagesAndRoutes(SiteUpdateEvent $event)
  70.     {
  71.         $this->updateExistingPages($event);
  72.         $this->validateRemainingUnchangedControllers($event);
  73.         $this->updateExistingRoutes($event);
  74.     }
  75.     /**
  76.      * @throws DBALException
  77.      */
  78.     private function updateExistingPages(SiteUpdateEvent $event)
  79.     {
  80.         $pages $this->entityManager->getRepository(Page::class)
  81.             ->findAll()
  82.         ;
  83.         $pages array_filter($pages, function (Page $page) {
  84.             return null !== $page->getController();
  85.         });
  86.         $dbConnection $this->entityManager->getConnection();
  87.         /** @var Page $page */
  88.         foreach ($pages as $page) {
  89.             if (!isset($this->pageControllerMapping[$page->getController()])) {
  90.                 continue;
  91.             }
  92.             $event->getOutput()->writeln(sprintf(
  93.                 '<comment>Updating Page</comment> change %s to %s',
  94.                 $page->getController(),
  95.                 $this->pageControllerMapping[$page->getController()]
  96.             ));
  97.             $dbConnection->exec(
  98.                 sprintf(
  99.                     'UPDATE `page` SET `controller` = "%s" WHERE `id` = %d',
  100.                     addslashes($this->pageControllerMapping[$page->getController()]),
  101.                     $page->getId()
  102.                 )
  103.             );
  104.         }
  105.     }
  106.     /**
  107.      * @throws DBALException
  108.      */
  109.     private function updateExistingRoutes(SiteUpdateEvent $event)
  110.     {
  111.         $event->getOutput()->writeln(\PHP_EOL.'<comment>Start updating</comment> routes to sf4 namespace');
  112.         $dbConnection $this->entityManager->getConnection();
  113.         $dbConnection->exec(
  114.             sprintf(
  115.                 "UPDATE `orm_routes` SET `defaults` = REPLACE(defaults, '%s', '%s')",
  116.                 '31:"Pages\\\PagesBundle',
  117.                 '17:"App'
  118.             )
  119.         );
  120.         $dbConnection->exec(
  121.             sprintf(
  122.                 "UPDATE `orm_routes` SET `defaults` = REPLACE(defaults, '%s', '%s')",
  123.                 '32:"Pages\\\PagesBundle',
  124.                 '18:"App'
  125.             )
  126.         );
  127.         $dbConnection->exec(
  128.             sprintf(
  129.                 "UPDATE `orm_routes` SET `defaults` = REPLACE(defaults, '%s', '%s')",
  130.                 '33:"Pages\\\PagesBundle',
  131.                 '19:"App'
  132.             )
  133.         );
  134.         $event->getOutput()->writeln('<comment>Finished updating</comment> routes to sf4 namespace');
  135.         $dbConnection->exec('UPDATE `orm_routes` SET `name` = lcase(name)');
  136.         $event->getOutput()->writeln('<comment>Transformed</comment> all route names to lowercase');
  137.     }
  138.     private function validateRemainingUnchangedControllers(SiteUpdateEvent $event)
  139.     {
  140.         $event->getOutput()->writeln('<comment>Validating</comment> controllers in page table');
  141.         $pages $this->entityManager->getRepository(Page::class)
  142.             ->findAll();
  143.         $controllerNamespace 'App\\Controller';
  144.         foreach ($pages as $page) {
  145.             $this->entityManager->refresh($page);
  146.         }
  147.         $pages array_filter($pages, function (Page $page) use ($controllerNamespace) {
  148.             return null !== $page->getController() && mb_substr($page->getController(), 0mb_strlen($controllerNamespace)) !== $controllerNamespace;
  149.         });
  150.         if (empty($pages)) {
  151.             return;
  152.         }
  153.         $event->getOutput()->writeln(sprintf('<error>%d invalid controllers found</error>'\count($pages)));
  154.         $event->getOutput()->writeln('<error>Invalid controllers are:</error>');
  155.         /** @var Page $page */
  156.         foreach ($pages as $page) {
  157.             $event->getOutput()->writeln(' - '.$page->getController());
  158.         }
  159.     }
  160. }