vendor/pimcore/pimcore/bundles/CoreBundle/Request/ParamConverter/DataObjectParamResolver.php line 85

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\Bundle\CoreBundle\Request\ParamConverter;
  16. use Pimcore\Model\DataObject\AbstractObject;
  17. use Pimcore\Model\DataObject\Concrete;
  18. use Pimcore\Request\Attribute\DataObjectParam;
  19. use Pimcore\Tool;
  20. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
  23. use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
  24. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  25. /**
  26.  * @internal
  27.  */
  28. class DataObjectParamResolver implements ArgumentValueResolverInterface
  29. {
  30.     /**
  31.      * @return DataObjectParam[]
  32.      */
  33.     private function getDataObjectOptions(Request $requestArgumentMetadata $argument): array
  34.     {
  35.         $options $argument->getAttributes(DataObjectParam::class, ArgumentMetadata::IS_INSTANCEOF);
  36.         if (!isset($options[0])) {
  37.             $converters $request->attributes->get('_converters');
  38.             $converter $converters[0] ?? false;
  39.             if ($converter instanceof ParamConverter) {
  40.                 trigger_deprecation(
  41.                     'pimcore/pimcore',
  42.                     '10.6',
  43.                     'Usage of @ParamConverter annotation is deprecated. please use #[DataObjectParam] argument attribute instead.'
  44.                 );
  45.                 $options[0] = new DataObjectParam($converter->getClass(), $converter->getOptions()['unpublished'] ?? null$converter->getOptions());
  46.             }
  47.         }
  48.         return $options;
  49.     }
  50.     /**
  51.      * {@inheritdoc}
  52.      *
  53.      * @throws NotFoundHttpException When invalid data object ID given
  54.      */
  55.     public function resolve(Request $requestArgumentMetadata $argument): iterable
  56.     {
  57.         $options $this->getDataObjectOptions($request$argument);
  58.         $class $options[0]->class ?? $argument->getType();
  59.         $param $argument->getName();
  60.         $value $request->attributes->get($param);
  61.         if (!$value && $argument->isNullable()) {
  62.             $request->attributes->set($paramnull);
  63.             return [null];
  64.         }
  65.         /** @var Concrete|null $object */
  66.         $object $value instanceof AbstractObject $value $class::getById($value);
  67.         if (!$object) {
  68.             throw new NotFoundHttpException(sprintf('Invalid data object ID given for parameter "%s".'$param));
  69.         } elseif (
  70.             !$object->isPublished()
  71.             && !Tool::isElementRequestByAdmin($request$object)
  72.             && (!isset($options[0]) || !$options[0]->unpublished)
  73.         ) {
  74.             throw new NotFoundHttpException(sprintf('Data object for parameter "%s" is not published.'$param));
  75.         }
  76.         $request->attributes->set($param$object);
  77.         return [$object];
  78.     }
  79.     public function supports(Request $requestArgumentMetadata $argument)
  80.     {
  81.         $param $argument->getName();
  82.         if (!$request->attributes->has($param)) {
  83.             return false;
  84.         }
  85.         $options $this->getDataObjectOptions($request$argument);
  86.         $class $options[0]->class ?? $argument->getType();
  87.         return $class !== null && is_subclass_of($classAbstractObject::class);
  88.     }
  89. }