123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Validator\Mapping;
- use Symfony\Component\Validator\Constraint;
- use Symfony\Component\Validator\Constraints\Composite;
- use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
- /**
- * Stores all metadata needed for validating a class property.
- *
- * The method of accessing the property's value must be specified by subclasses
- * by implementing the {@link newReflectionMember()} method.
- *
- * This class supports serialization and cloning.
- *
- * @author Bernhard Schussek <bschussek@gmail.com>
- *
- * @see PropertyMetadataInterface
- */
- abstract class MemberMetadata extends GenericMetadata implements PropertyMetadataInterface
- {
- /**
- * @internal This property is public in order to reduce the size of the
- * class' serialized representation. Do not access it. Use
- * {@link getClassName()} instead.
- */
- public $class;
- /**
- * @internal This property is public in order to reduce the size of the
- * class' serialized representation. Do not access it. Use
- * {@link getName()} instead.
- */
- public $name;
- /**
- * @internal This property is public in order to reduce the size of the
- * class' serialized representation. Do not access it. Use
- * {@link getPropertyName()} instead.
- */
- public $property;
- /**
- * @var \ReflectionMethod[]|\ReflectionProperty[]
- */
- private $reflMember = [];
- /**
- * @param string $class The name of the class this member is defined on
- * @param string $name The name of the member
- * @param string $property The property the member belongs to
- */
- public function __construct(string $class, string $name, string $property)
- {
- $this->class = $class;
- $this->name = $name;
- $this->property = $property;
- }
- /**
- * {@inheritdoc}
- */
- public function addConstraint(Constraint $constraint)
- {
- $this->checkConstraint($constraint);
- parent::addConstraint($constraint);
- return $this;
- }
- /**
- * {@inheritdoc}
- */
- public function __sleep()
- {
- return array_merge(parent::__sleep(), [
- 'class',
- 'name',
- 'property',
- ]);
- }
- /**
- * Returns the name of the member.
- *
- * @return string
- */
- public function getName()
- {
- return $this->name;
- }
- /**
- * {@inheritdoc}
- */
- public function getClassName()
- {
- return $this->class;
- }
- /**
- * {@inheritdoc}
- */
- public function getPropertyName()
- {
- return $this->property;
- }
- /**
- * Returns whether this member is public.
- *
- * @param object|string $objectOrClassName The object or the class name
- *
- * @return bool
- */
- public function isPublic($objectOrClassName)
- {
- return $this->getReflectionMember($objectOrClassName)->isPublic();
- }
- /**
- * Returns whether this member is protected.
- *
- * @param object|string $objectOrClassName The object or the class name
- *
- * @return bool
- */
- public function isProtected($objectOrClassName)
- {
- return $this->getReflectionMember($objectOrClassName)->isProtected();
- }
- /**
- * Returns whether this member is private.
- *
- * @param object|string $objectOrClassName The object or the class name
- *
- * @return bool
- */
- public function isPrivate($objectOrClassName)
- {
- return $this->getReflectionMember($objectOrClassName)->isPrivate();
- }
- /**
- * Returns the reflection instance for accessing the member's value.
- *
- * @param object|string $objectOrClassName The object or the class name
- *
- * @return \ReflectionMethod|\ReflectionProperty The reflection instance
- */
- public function getReflectionMember($objectOrClassName)
- {
- $className = \is_string($objectOrClassName) ? $objectOrClassName : \get_class($objectOrClassName);
- if (!isset($this->reflMember[$className])) {
- $this->reflMember[$className] = $this->newReflectionMember($objectOrClassName);
- }
- return $this->reflMember[$className];
- }
- /**
- * Creates a new reflection instance for accessing the member's value.
- *
- * Must be implemented by subclasses.
- *
- * @param object|string $objectOrClassName The object or the class name
- *
- * @return \ReflectionMethod|\ReflectionProperty The reflection instance
- */
- abstract protected function newReflectionMember($objectOrClassName);
- private function checkConstraint(Constraint $constraint)
- {
- if (!\in_array(Constraint::PROPERTY_CONSTRAINT, (array) $constraint->getTargets(), true)) {
- throw new ConstraintDefinitionException(sprintf('The constraint "%s" cannot be put on properties or getters.', get_debug_type($constraint)));
- }
- if ($constraint instanceof Composite) {
- foreach ($constraint->getNestedContraints() as $nestedContraint) {
- $this->checkConstraint($nestedContraint);
- }
- }
- }
- }
|