app/Plugin/ApgRichCategory/RoutingListener.php line 51

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: k_akiyoshi
  5.  * Date: 2020/08/06
  6.  * Time: 11:20
  7.  */
  8. namespace Plugin\ApgRichCategory;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Eccube\Entity\Category;
  11. use Eccube\Repository\CategoryRepository;
  12. use Eccube\Request\Context;
  13. use Plugin\ApgRichCategory\Domain\UrlType;
  14. use Plugin\ApgRichCategory\Entity\Config;
  15. use Plugin\ApgRichCategory\Repository\ConfigRepository;
  16. use Symfony\Component\DependencyInjection\ContainerInterface;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. use Symfony\Component\HttpKernel\EventListener\RouterListener;
  20. use Symfony\Component\Routing\Matcher\UrlMatcher;
  21. use Symfony\Component\Routing\RequestContext;
  22. use Symfony\Component\Routing\Route;
  23. use Symfony\Component\Routing\RouteCollection;
  24. use Symfony\Component\Routing\RouterInterface;
  25. class RoutingListener extends RouterListener
  26. {
  27.     /** @var Context */
  28.     private $context;
  29.     /** @var ContainerInterface */
  30.     private $container;
  31.     /** @var RequestStack */
  32.     private $requestStack;
  33.     /** @var EntityManagerInterface */
  34.     private $em;
  35.     /** @var RouterInterface */
  36.     private $router;
  37.     /** @var RouteCollection */
  38.     private $routeCollection;
  39.     /**
  40.      * コンストラクタ
  41.      *
  42.      * @param ContainerInterface $container
  43.      * @param RequestStack $requestStack
  44.      */
  45.     public function __construct(
  46.         ContainerInterface     $container,
  47.         Context                $context,
  48.         RequestStack           $requestStack,
  49.         EntityManagerInterface $entityManager,
  50.         RouterInterface        $router
  51.     )
  52.     {
  53.         $this->context $context;
  54.         $this->container $container;
  55.         $this->requestStack $requestStack;
  56.         $this->em $entityManager;
  57.         $this->router $router;
  58.         $this->routeCollection $this->router->getRouteCollection();
  59.         $this->initialize();
  60.         $matcher = new UrlMatcher($this->routeCollection, new RequestContext());
  61.         parent::__construct($matcher$requestStack);
  62.     }
  63.     private function initialize()
  64.     {
  65.         /** @var ConfigRepository $configRepository */
  66.         $configRepository $this->em->getRepository(Config::class);
  67.         $config $configRepository->getOrNew();
  68.         $request $this->requestStack->getCurrentRequest();
  69.         $pathInfo $request->getPathInfo();
  70.         $path ltrim($pathInfo"/");
  71.         $url $request->getRequestUri();
  72.         if (empty(parse_url($url)['query'])) {
  73.             $queries = [];
  74.         } else {
  75.             parse_str(parse_url($url)['query'], $queries);
  76.         }
  77.         /** @var CategoryRepository $categoryRepository */
  78.         $categoryRepository $this->em->getRepository(Category::class);
  79.         if ($config->getUrlType() === UrlType::SLUG) {
  80.             // カテゴリにつけられたスラッグのルーティングを全て設定する
  81.             $qb $categoryRepository->createQueryBuilder('c')
  82.                 ->select('c.slug')
  83.                 ->getQuery();;
  84.             $slugList $qb->getResult();
  85.             foreach ($slugList as $slug) {
  86.                 if (!empty($slug['slug'])) {
  87.                     $s $slug['slug'];
  88.                     $this->routeCollection->add('apg_rich_category.' str_replace("/""."$s),
  89.                         new Route(
  90.                             '/' $s,
  91.                             [
  92.                                 '_controller' => "Eccube\Controller\ProductController::index",
  93.                             ]
  94.                         )
  95.                     );
  96.                 }
  97.             }
  98.             if ($this->context->isFront()) {
  99.                 $Category $categoryRepository->findOneBy([
  100.                     'slug' => $path
  101.                 ]);
  102.                 if (empty($Category)) {
  103.                     $pattern '|products/list/([\d]+)|';
  104.                     $matches = [];
  105.                     if (preg_match($pattern$path$matches)) {
  106.                         $categoryId $matches[1];
  107.                         if (!empty($categoryId)) {
  108.                             /** @var Category $Category */
  109.                             $Category $categoryRepository->findOneBy([
  110.                                 'id' => $categoryId
  111.                             ]);
  112.                             if (!empty($Category) && !empty($Category->getSlug())) {
  113.                                 unset($queries['category_id']);
  114.                                 $url "/" $Category->getSlug();
  115.                                 if (!empty($queries)) {
  116.                                     $newQueryStr "";
  117.                                     foreach ($queries as $key => $value) {
  118.                                         $newQueryStr .= "&" $key "=" $value;
  119.                                     }
  120.                                     $url .= "?" ltrim($newQueryStr"&");
  121.                                 }
  122.                                 $redirectResponse = new RedirectResponse($url302);
  123.                                 $redirectResponse->send();
  124.                                 return;
  125.                             } elseif (!empty($Category)) {
  126.                                 $queries['category_id'] = $categoryId;
  127.                                 $url $this->router->generate('product_list'$queries);
  128.                                 $redirectResponse = new RedirectResponse($url302);
  129.                                 $redirectResponse->send();
  130.                                 return;
  131.                             }
  132.                         }
  133.                     } else {
  134.                         $categoryId $request->query->get('category_id');
  135.                         if (!empty($categoryId)) {
  136.                             /** @var Category $Category */
  137.                             $Category $categoryRepository->findOneBy([
  138.                                 'id' => $categoryId
  139.                             ]);
  140.                             if (!empty($Category) && !empty($Category->getSlug())) {
  141.                                 unset($queries['category_id']);
  142.                                 $url "/" $Category->getSlug();
  143.                                 if (!empty($queries)) {
  144.                                     $newQueryStr "";
  145.                                     foreach ($queries as $key => $value) {
  146.                                         $newQueryStr .= "&" $key "=" $value;
  147.                                     }
  148.                                     $url .= "?" ltrim($newQueryStr"&");
  149.                                 }
  150.                                 $redirectResponse = new RedirectResponse($url302);
  151.                                 $redirectResponse->send();
  152.                                 return;
  153.                             }
  154.                         }
  155.                     }
  156.                 }
  157.             }
  158.         } elseif ($config->getUrlType() === UrlType::ID) {
  159.             if ($this->context->isFront()) {
  160.                 $pattern '|products/list/([\d]+)|';
  161.                 $matches = [];
  162.                 if (preg_match($pattern$path$matches)) {
  163.                     $this->routeCollection->add('product_list.category_id',
  164.                         new Route(
  165.                             '/products/list/{category_id}',
  166.                             [
  167.                                 '_controller' => "Eccube\Controller\ProductController::index",
  168.                             ]
  169.                         )
  170.                     );
  171.                 } else {
  172.                     $categoryId $request->query->get('category_id');
  173.                     if (!empty($categoryId)) {
  174.                         unset($queries['category_id']);
  175.                         $url $this->router->generate('product_list');
  176.                         $url $url '/' $categoryId;
  177.                         if (!empty($queries)) {
  178.                             $newQueryStr "";
  179.                             foreach ($queries as $key => $value) {
  180.                                 $newQueryStr .= "&" $key "=" $value;
  181.                             }
  182.                             $url .= "?" ltrim($newQueryStr"&");
  183.                         }
  184.                         $redirectResponse = new RedirectResponse($url302);
  185.                         $redirectResponse->send();
  186.                         return;
  187.                     }
  188.                 }
  189.             }
  190.         }
  191.     }
  192. }