* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Validator\Validator; use Symfony\Component\Validator\Context\ExecutionContextInterface; /** * Collects some data about validator calls. * * @author Maxime Steinhausser */ class TraceableValidator implements ValidatorInterface { private $validator; private $collectedData = array(); public function __construct(ValidatorInterface $validator) { $this->validator = $validator; } /** * @return array */ public function getCollectedData() { return $this->collectedData; } public function reset() { $this->collectedData = array(); } /** * {@inheritdoc} */ public function getMetadataFor($value) { return $this->validator->getMetadataFor($value); } /** * {@inheritdoc} */ public function hasMetadataFor($value) { return $this->validator->hasMetadataFor($value); } /** * {@inheritdoc} */ public function validate($value, $constraints = null, $groups = null) { $violations = $this->validator->validate($value, $constraints, $groups); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 7); $file = $trace[0]['file']; $line = $trace[0]['line']; for ($i = 1; $i < 7; ++$i) { if (isset($trace[$i]['class'], $trace[$i]['function']) && 'validate' === $trace[$i]['function'] && is_a($trace[$i]['class'], ValidatorInterface::class, true) ) { $file = $trace[$i]['file']; $line = $trace[$i]['line']; while (++$i < 7) { if (isset($trace[$i]['function'], $trace[$i]['file']) && empty($trace[$i]['class']) && 0 !== strpos($trace[$i]['function'], 'call_user_func')) { $file = $trace[$i]['file']; $line = $trace[$i]['line']; break; } } break; } } $name = str_replace('\\', '/', $file); $name = substr($name, strrpos($name, '/') + 1); $this->collectedData[] = array( 'caller' => compact('name', 'file', 'line'), 'context' => compact('value', 'constraints', 'groups'), 'violations' => iterator_to_array($violations), ); return $violations; } /** * {@inheritdoc} */ public function validateProperty($object, $propertyName, $groups = null) { return $this->validator->validateProperty($object, $propertyName, $groups); } /** * {@inheritdoc} */ public function validatePropertyValue($objectOrClass, $propertyName, $value, $groups = null) { return $this->validator->validatePropertyValue($objectOrClass, $propertyName, $value, $groups); } /** * {@inheritdoc} */ public function startContext() { return $this->validator->startContext(); } /** * {@inheritdoc} */ public function inContext(ExecutionContextInterface $context) { return $this->validator->inContext($context); } } __halt_compiler();----SIGNATURE:----gPi79kEswLRuIgl+oa7SqjrQ8mFSraH/kT+ox7kkh43tFTJSBJJTOA7Y5MR4ZLDvSgN/ScMmZQZML0y1Y3t0Kg4dDMGW9Td4bkzeJ3W8afbb5PijgNNLL2Y/4d0UaQ8b8R78be33tTV3/EPRmU9I8IAAXo95wWOCl8D+CV0cNIV2IM2xV+eF/tXk+q2PvCLMg8tAUDT+VXsau0hmdenmlOtQBEhwfBYouqrjWkMbWO5hnwxCqcEaYiNEEwpBgTN8RDeegk710PT2JT/nzGzt2GHCsAQaquM9XQbsbHVLPsz1dh62fYL2kt89eq4kPtJ3+Pfv/d11FdWj7Mq5G4l75vdGUEV8TjdNkM/opL61xQ2Rt3faLZrjadHaKjfcV7kOkV6iVd/Qz4W1OBwwxZYbSfKwr0qTfI5biLTbt49tlZxI5G90+lwbzUhGzQRK5+wOG6kwUUT9C6aRbaqGVD2s0EDd+ENJuNxobWcqK79G/kb8HBJUOyedL4LZbyuLsnleIamj2DFyk6YtrLrpUgic59CGDLgUW9dE/10VQXMCLQlgbS2MBZKzhgEOqfrUgUTbcetvvUsBhbJzIfn67fZdOKV6m6YzdhvL3+ePIX3xPkC/9deiyKXAXBD0EnJ97FEf0wPEzzorkodAQaqqqjTuEFjBS27rDESZ9cbvI2JN8ss=----ATTACHMENT:----OTI1MTg5MDIwMDUzNDA5OSA4MTk2MDA3Nzg5NTI3MTE5IDg4MTA2MTkzMzgzNzE3NDQ=