vendor/pimcore/pimcore/lib/Controller/Config/ConfigNormalizer.php line 63

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 Enterprise License (PEL)
  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 PEL
  14.  */
  15. namespace Pimcore\Controller\Config;
  16. use Doctrine\Common\Util\Inflector;
  17. use Symfony\Component\HttpKernel\KernelInterface;
  18. /**
  19.  * This service exists as integration point between legacy module/controller/action <-> new bundle/controller/action and
  20.  * to handle default bundle/controller/action in case it is not configured.
  21.  *
  22.  * Most of the normalizations here could be removed when we do not need to support legacy ZF1 notations (e.g. DB was
  23.  * fully migrated).
  24.  *
  25.  * TODO use a config switch to enable/disable ZF1 compatibility
  26.  */
  27. class ConfigNormalizer
  28. {
  29.     /**
  30.      * @var KernelInterface
  31.      */
  32.     private $kernel;
  33.     /**
  34.      * @var array
  35.      */
  36.     private $bundleCache = [];
  37.     /**
  38.      * @param KernelInterface $kernel
  39.      */
  40.     public function __construct(KernelInterface $kernel)
  41.     {
  42.         $this->kernel $kernel;
  43.     }
  44.     /**
  45.      * Transform parent/controller/action into a controller reference string
  46.      *
  47.      * @param string|null $bundle Bundle or (legacy) module
  48.      * @param string|null $controller
  49.      * @param string|null $action
  50.      *
  51.      * @return string
  52.      */
  53.     public function formatControllerReference(string $bundle nullstring $controller nullstring $action null): string
  54.     {
  55.         $action $this->normalizeActionName($action);
  56.         // check if controller is a service (prefixed with @)
  57.         if (null !== $controller && === strpos($controller'@')) {
  58.             return sprintf(
  59.                 '%s:%sAction',
  60.                 substr($controller1),
  61.                 $action
  62.             );
  63.         } else {
  64.             $bundle $this->normalizeBundleName($bundle);
  65.             $controller $this->normalizeControllerName($controller);
  66.             return sprintf(
  67.                 '%s:%s:%s',
  68.                 $bundle,
  69.                 $controller,
  70.                 $action
  71.             );
  72.         }
  73.     }
  74.     /**
  75.      * Normalize module/bundle name (App -> AppBundle, module -> ModuleBundle)
  76.      *
  77.      * @param string|null $bundle
  78.      *
  79.      * @return string
  80.      */
  81.     public function normalizeBundleName(string $bundle null): string
  82.     {
  83.         if (empty($bundle)) {
  84.             return PIMCORE_SYMFONY_DEFAULT_BUNDLE;
  85.         }
  86.         $originalBundle $bundle;
  87.         // bundle name contains Bundle - we assume it's properly formatted
  88.         if (false !== strpos($bundle'Bundle')) {
  89.             return $bundle;
  90.         }
  91.         // App -> AppBundle
  92.         $bundle strtolower($bundle);
  93.         if (isset($this->bundleCache[$bundle])) {
  94.             return $this->bundleCache[$bundle];
  95.         }
  96.         foreach ($this->kernel->getBundles() as $bundleInstance) {
  97.             if ($bundle 'bundle' === strtolower($bundleInstance->getName())) {
  98.                 $this->bundleCache[$bundle] = $bundleInstance->getName();
  99.                 return $this->bundleCache[$bundle];
  100.             }
  101.         }
  102.         throw new \RuntimeException(sprintf('Unable to normalize string "%s" into a valid bundle name'$originalBundle));
  103.     }
  104.     /**
  105.      * Normalize controller name from category_controller to Category/Controller
  106.      *
  107.      * @param string|null $controller
  108.      *
  109.      * @return string
  110.      */
  111.     public function normalizeControllerName(string $controller null): string
  112.     {
  113.         if (empty($controller)) {
  114.             return PIMCORE_SYMFONY_DEFAULT_BUNDLE;
  115.         }
  116.         // split submodules with _ and uppercase first character
  117.         $controllerParts array_map(function ($part) {
  118.             return ucfirst($part);
  119.         }, explode('_'$controller));
  120.         $controller implode('/'$controllerParts);
  121.         return $controller;
  122.     }
  123.     /**
  124.      * Normalize action name form action-name to actionName
  125.      *
  126.      * @param string|null $action
  127.      *
  128.      * @return string
  129.      */
  130.     public function normalizeActionName(string $action null): string
  131.     {
  132.         if (empty($action)) {
  133.             return defined('PIMCORE_SYMFONY_DEFAULT_ACTION') ? PIMCORE_SYMFONY_DEFAULT_ACTION 'default';
  134.         }
  135.         return Inflector::camelize($action);
  136.     }
  137.     /**
  138.      * Normalize template from .php to .html.php and remove leading slash
  139.      *
  140.      * @param string|null $template
  141.      *
  142.      * @return string|null
  143.      */
  144.     public function normalizeTemplateName(string $template null)
  145.     {
  146.         // we just return the original value as template could be null
  147.         // do NOT use a string return type for this method!
  148.         if (empty($template)) {
  149.             return $template;
  150.         }
  151.         // if we find colons in the template name we assume it's properly formatted for Symfony
  152.         if (false !== strpos($template':')) {
  153.             return $template;
  154.         }
  155.         // if we find Bundle in the template name we assume it's properly formatted for Symfony
  156.         if (false !== strpos($template'Bundle')) {
  157.             return $template;
  158.         }
  159.         // replace .php with .html.php
  160.         $suffixPattern '/(?<!\.html)\.php$/i';
  161.         if (preg_match($suffixPattern$template)) {
  162.             $template preg_replace($suffixPattern'.html.php'$template);
  163.         }
  164.         // split template into path and filename
  165.         if (substr($template01) === '/') {
  166.             $template substr($template1);
  167.         }
  168.         $path '';
  169.         if (false !== strpos($template'/')) {
  170.             $parts explode('/'$template);
  171.             $template array_pop($parts);
  172.             // ucfirst to match views/Content - TODO should we remove this?
  173.             $path implode('/'$parts);
  174.             $path ucfirst($path);
  175.         }
  176.         return sprintf('%s/%s'$path$template);
  177.     }
  178. }