1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Validator\Violation;
13
14use Symfony\Component\Translation\TranslatorInterface;
15use Symfony\Component\Validator\Constraint;
16use Symfony\Component\Validator\ConstraintViolation;
17use Symfony\Component\Validator\ConstraintViolationList;
18use Symfony\Component\Validator\Util\PropertyPath;
19
20/**
21 * Default implementation of {@link ConstraintViolationBuilderInterface}.
22 *
23 * @author Bernhard Schussek <bschussek@gmail.com>
24 *
25 * @internal since version 2.5. Code against ConstraintViolationBuilderInterface instead.
26 */
27class ConstraintViolationBuilder implements ConstraintViolationBuilderInterface
28{
29    private $violations;
30    private $message;
31    private $parameters;
32    private $root;
33    private $invalidValue;
34    private $propertyPath;
35    private $translator;
36    private $translationDomain;
37    private $plural;
38    private $constraint;
39    private $code;
40
41    /**
42     * @var mixed
43     */
44    private $cause;
45
46    public function __construct(ConstraintViolationList $violations, Constraint $constraint, $message, array $parameters, $root, $propertyPath, $invalidValue, TranslatorInterface $translator, $translationDomain = null)
47    {
48        $this->violations = $violations;
49        $this->message = $message;
50        $this->parameters = $parameters;
51        $this->root = $root;
52        $this->propertyPath = $propertyPath;
53        $this->invalidValue = $invalidValue;
54        $this->translator = $translator;
55        $this->translationDomain = $translationDomain;
56        $this->constraint = $constraint;
57    }
58
59    /**
60     * {@inheritdoc}
61     */
62    public function atPath($path)
63    {
64        $this->propertyPath = PropertyPath::append($this->propertyPath, $path);
65
66        return $this;
67    }
68
69    /**
70     * {@inheritdoc}
71     */
72    public function setParameter($key, $value)
73    {
74        $this->parameters[$key] = $value;
75
76        return $this;
77    }
78
79    /**
80     * {@inheritdoc}
81     */
82    public function setParameters(array $parameters)
83    {
84        $this->parameters = $parameters;
85
86        return $this;
87    }
88
89    /**
90     * {@inheritdoc}
91     */
92    public function setTranslationDomain($translationDomain)
93    {
94        $this->translationDomain = $translationDomain;
95
96        return $this;
97    }
98
99    /**
100     * {@inheritdoc}
101     */
102    public function setInvalidValue($invalidValue)
103    {
104        $this->invalidValue = $invalidValue;
105
106        return $this;
107    }
108
109    /**
110     * {@inheritdoc}
111     */
112    public function setPlural($number)
113    {
114        $this->plural = $number;
115
116        return $this;
117    }
118
119    /**
120     * {@inheritdoc}
121     */
122    public function setCode($code)
123    {
124        $this->code = $code;
125
126        return $this;
127    }
128
129    /**
130     * {@inheritdoc}
131     */
132    public function setCause($cause)
133    {
134        $this->cause = $cause;
135
136        return $this;
137    }
138
139    /**
140     * {@inheritdoc}
141     */
142    public function addViolation()
143    {
144        if (null === $this->plural) {
145            $translatedMessage = $this->translator->trans(
146                $this->message,
147                $this->parameters,
148                $this->translationDomain
149            );
150        } else {
151            try {
152                $translatedMessage = $this->translator->transChoice(
153                    $this->message,
154                    $this->plural,
155                    $this->parameters,
156                    $this->translationDomain
157                );
158            } catch (\InvalidArgumentException $e) {
159                $translatedMessage = $this->translator->trans(
160                    $this->message,
161                    $this->parameters,
162                    $this->translationDomain
163                );
164            }
165        }
166
167        $this->violations->add(new ConstraintViolation(
168            $translatedMessage,
169            $this->message,
170            $this->parameters,
171            $this->root,
172            $this->propertyPath,
173            $this->invalidValue,
174            $this->plural,
175            $this->code,
176            $this->constraint,
177            $this->cause
178        ));
179    }
180}
181