vendor/pimcore/pimcore/lib/Routing/Dynamic/DataObjectRouteHandler.php line 89

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Routing\Dynamic;
  16. use Pimcore\Bundle\CoreBundle\EventListener\Frontend\ElementListener;
  17. use Pimcore\Config;
  18. use Pimcore\Http\Request\Resolver\SiteResolver;
  19. use Pimcore\Http\RequestHelper;
  20. use Pimcore\Model\DataObject;
  21. use Pimcore\Routing\DataObjectRoute;
  22. use Symfony\Component\Routing\Exception\RouteNotFoundException;
  23. use Symfony\Component\Routing\RouteCollection;
  24. /**
  25.  * @internal
  26.  */
  27. final class DataObjectRouteHandler implements DynamicRouteHandlerInterface
  28. {
  29.     /**
  30.      * @var SiteResolver
  31.      */
  32.     private $siteResolver;
  33.     /**
  34.      * @var RequestHelper
  35.      */
  36.     private $requestHelper;
  37.     /**
  38.      * @var Config
  39.      */
  40.     private $config;
  41.     /**
  42.      * @param SiteResolver $siteResolver
  43.      * @param RequestHelper $requestHelper
  44.      * @param Config $config
  45.      */
  46.     public function __construct(
  47.         SiteResolver $siteResolver,
  48.         RequestHelper $requestHelper,
  49.         Config $config
  50.     ) {
  51.         $this->siteResolver $siteResolver;
  52.         $this->requestHelper $requestHelper;
  53.         $this->config $config;
  54.     }
  55.     /**
  56.      * {@inheritdoc}
  57.      */
  58.     public function getRouteByName(string $name)
  59.     {
  60.         if (preg_match('/^data_object_(\d+)_(\d+)_(.*)$/'$name$match)) {
  61.             $slug DataObject\Data\UrlSlug::resolveSlug($match[3], (int) $match[2]);
  62.             if ($slug && $slug->getObjectId() == $match[1]) {
  63.                 /** @var DataObject\Concrete $object * */
  64.                 $object DataObject::getById((int) $match[1]);
  65.                 if ($object instanceof DataObject\Concrete && $object->isPublished()) {
  66.                     return $this->buildRouteForFromSlug($slug$object);
  67.                 }
  68.             }
  69.         }
  70.         throw new RouteNotFoundException(sprintf("Route for name '%s' was not found"$name));
  71.     }
  72.     /**
  73.      * {@inheritdoc}
  74.      */
  75.     public function matchRequest(RouteCollection $collectionDynamicRequestContext $context)
  76.     {
  77.         $site $this->siteResolver->getSite($context->getRequest());
  78.         $slug DataObject\Data\UrlSlug::resolveSlug($context->getOriginalPath(), $site $site->getId() : 0);
  79.         if ($slug) {
  80.             $object DataObject::getById($slug->getObjectId());
  81.             if ($object instanceof DataObject\Concrete) {
  82.                 $doBuildRoute $object->isPublished() || $this->requestHelper->isObjectPreviewRequestByAdmin($context->getRequest());
  83.                 if ($doBuildRoute) {
  84.                     $route $this->buildRouteForFromSlug($slug$object);
  85.                     $collection->add($route->getRouteKey(), $route);
  86.                 }
  87.             }
  88.         }
  89.     }
  90.     /**
  91.      * @param DataObject\Data\UrlSlug $slug
  92.      * @param DataObject\Concrete $object
  93.      *
  94.      * @return DataObjectRoute
  95.      *
  96.      * @throws \Exception
  97.      */
  98.     private function buildRouteForFromSlug(DataObject\Data\UrlSlug $slugDataObject\Concrete $object): DataObjectRoute
  99.     {
  100.         $site $this->siteResolver->getSite();
  101.         $route = new DataObjectRoute($slug->getSlug());
  102.         $route->setOption('utf8'true);
  103.         $route->setObject($object);
  104.         $route->setSlug($slug);
  105.         $route->setSite($site);
  106.         $route->setDefault('_controller'$slug->getAction());
  107.         $route->setDefault('object'$object);
  108.         $route->setDefault('urlSlug'$slug);
  109.         if ($slug->getOwnertype() === 'localizedfield') {
  110.             $route->setDefault('_locale'$slug->getPosition());
  111.         }
  112.         $route->setDefault(
  113.             ElementListener::FORCE_ALLOW_PROCESSING_UNPUBLISHED_ELEMENTS,
  114.             $this->config['routing']['allow_processing_unpublished_fallback_document']
  115.         );
  116.         return $route;
  117.     }
  118. }