vendor/symfony/form/Extension/Core/DataAccessor/PropertyPathAccessor.php line 29

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Form\Extension\Core\DataAccessor;
  11. use Symfony\Component\Form\DataAccessorInterface;
  12. use Symfony\Component\Form\Exception\AccessException;
  13. use Symfony\Component\Form\FormInterface;
  14. use Symfony\Component\PropertyAccess\Exception\AccessException as PropertyAccessException;
  15. use Symfony\Component\PropertyAccess\Exception\UninitializedPropertyException;
  16. use Symfony\Component\PropertyAccess\PropertyAccess;
  17. use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
  18. use Symfony\Component\PropertyAccess\PropertyPathInterface;
  19. /**
  20.  * Writes and reads values to/from an object or array using property path.
  21.  *
  22.  * @author Yonel Ceruto <yonelceruto@gmail.com>
  23.  * @author Bernhard Schussek <bschussek@gmail.com>
  24.  */
  25. class PropertyPathAccessor implements DataAccessorInterface
  26. {
  27.     private $propertyAccessor;
  28.     public function __construct(PropertyAccessorInterface $propertyAccessor null)
  29.     {
  30.         $this->propertyAccessor $propertyAccessor ?? PropertyAccess::createPropertyAccessor();
  31.     }
  32.     /**
  33.      * {@inheritdoc}
  34.      */
  35.     public function getValue($dataFormInterface $form)
  36.     {
  37.         if (null === $propertyPath $form->getPropertyPath()) {
  38.             throw new AccessException('Unable to read from the given form data as no property path is defined.');
  39.         }
  40.         return $this->getPropertyValue($data$propertyPath);
  41.     }
  42.     /**
  43.      * {@inheritdoc}
  44.      */
  45.     public function setValue(&$data$propertyValueFormInterface $form): void
  46.     {
  47.         if (null === $propertyPath $form->getPropertyPath()) {
  48.             throw new AccessException('Unable to write the given value as no property path is defined.');
  49.         }
  50.         // If the field is of type DateTimeInterface and the data is the same skip the update to
  51.         // keep the original object hash
  52.         if ($propertyValue instanceof \DateTimeInterface && $propertyValue == $this->getPropertyValue($data$propertyPath)) {
  53.             return;
  54.         }
  55.         // If the data is identical to the value in $data, we are
  56.         // dealing with a reference
  57.         if (!\is_object($data) || !$form->getConfig()->getByReference() || $propertyValue !== $this->getPropertyValue($data$propertyPath)) {
  58.             $this->propertyAccessor->setValue($data$propertyPath$propertyValue);
  59.         }
  60.     }
  61.     /**
  62.      * {@inheritdoc}
  63.      */
  64.     public function isReadable($dataFormInterface $form): bool
  65.     {
  66.         return null !== $form->getPropertyPath();
  67.     }
  68.     /**
  69.      * {@inheritdoc}
  70.      */
  71.     public function isWritable($dataFormInterface $form): bool
  72.     {
  73.         return null !== $form->getPropertyPath();
  74.     }
  75.     private function getPropertyValue($dataPropertyPathInterface $propertyPath)
  76.     {
  77.         try {
  78.             return $this->propertyAccessor->getValue($data$propertyPath);
  79.         } catch (PropertyAccessException $e) {
  80.             if (!$e instanceof UninitializedPropertyException
  81.                 // For versions without UninitializedPropertyException check the exception message
  82.                 && (class_exists(UninitializedPropertyException::class) || false === strpos($e->getMessage(), 'You should initialize it'))
  83.             ) {
  84.                 throw $e;
  85.             }
  86.             return null;
  87.         }
  88.     }
  89. }