<p dir="auto">The Assert\Valid is not taken into account and the form is just considered valid, even if the constraints are not met. The issue can be reproduced by taking the example over here :<br>
<a href="http://symfony.com/doc/current/book/forms.html#embedding-a-single-object" rel="nofollow">http://symfony.com/doc/current/book/forms.html#embedding-a-single-object</a></p>
<ul dir="auto">
<li>Add any constraint to Entity\Category with: <code class="notranslate">groups={"validationgroup"}</code></li>
<li>Change <code class="notranslate">@Assert\Type(...)</code> in Entity\Task to <code class="notranslate">@Assert\Valid</code></li>
<li>Add <code class="notranslate">'validation_groups' =&gt; array('validationgroup')</code> to Form\Type\CategoryType in <code class="notranslate">$resolver-&gt;setDefaults</code></li>
<li>Remove <code class="notranslate">'cascade_validation' =&gt; true,</code> from Form/Type/TaskType. As we use Assert\Valid, this should not be necessary, or am I wrong?</li>
<li>Create a controller:</li>
</ul>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="class TestController extends Controller
{
    public function indexAction()
    {
        $form = $this-&gt;createForm(new TaskType(), new Task());
        $form-&gt;add('save', 'submit');

        $form-&gt;handleRequest($this-&gt;getRequest());

        if($form-&gt;isValid()){
            echo '&lt;p&gt;the form is valid...&lt;/p&gt;';
        }

        return $this-&gt;render('AcmeDemoBundle:Test:taskform.html.twig', array(
            'form' =&gt; $form-&gt;createView()
        ));
    }
}"><pre class="notranslate"><code class="notranslate">class TestController extends Controller
{
    public function indexAction()
    {
        $form = $this-&gt;createForm(new TaskType(), new Task());
        $form-&gt;add('save', 'submit');

        $form-&gt;handleRequest($this-&gt;getRequest());

        if($form-&gt;isValid()){
            echo '&lt;p&gt;the form is valid...&lt;/p&gt;';
        }

        return $this-&gt;render('AcmeDemoBundle:Test:taskform.html.twig', array(
            'form' =&gt; $form-&gt;createView()
        ));
    }
}
</code></pre></div>
<ul dir="auto">
<li>and twig template :</li>
</ul>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;h3&gt;Add task&lt;/h3&gt;
{{ form(form) }}"><pre class="notranslate"><code class="notranslate">&lt;h3&gt;Add task&lt;/h3&gt;
{{ form(form) }}
</code></pre></div>
<p dir="auto">I can provide you this bundle, zipped, if you want. I have also found that (by placing a debug closure in <code class="notranslate">validation_groups</code>) the <code class="notranslate">validation_groups</code> is read by the validator but it doesn't seem to be used.</p>
<p dir="auto">Tested with version 2.3.7</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5efc3ddaed1bedc42eb9c0cb130794650f526dcdfe3f60e830800ba81ec966ed/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313330393534342f313634323434312f61343861333863382d353838332d313165332d393263312d3736323237343132363433662e504e47"><img src="https://camo.githubusercontent.com/5efc3ddaed1bedc42eb9c0cb130794650f526dcdfe3f60e830800ba81ec966ed/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313330393534342f313634323434312f61343861333863382d353838332d313165332d393263312d3736323237343132363433662e504e47" alt="capture" data-canonical-src="https://f.cloud.github.com/assets/1309544/1642441/a48a38c8-5883-11e3-92c1-76227412643f.PNG" style="max-width: 100%;"></a></p>
<p dir="auto">I have an entity where I'm using the following validators:</p>
<div class="highlight highlight-text-html-php notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/**
 * @Assert\Callback(methods={&quot;isValid&quot;}, groups={&quot;group1&quot;, &quot;group2&quot;})
 */
class UserProduct
{
    /**
     * @var string $title
     * @Assert\NotBlank(message=&quot;title.blank&quot;, groups={&quot;group1&quot;, &quot;group2&quot;});
     */
    private $title;

    /**
     * @var Project\AuthenticationBundle\Entity\User
     * @Assert\Valid(groups={&quot;group2&quot;});
     */
    private $user;"><pre class="notranslate"><span class="pl-c">/**</span>
<span class="pl-c"> * @Assert\Callback(methods={"isValid"}, groups={"group1", "group2"})</span>
<span class="pl-c"> */</span>
<span class="pl-k">class</span> <span class="pl-v">UserProduct</span>
{
    <span class="pl-c">/**</span>
<span class="pl-c">     * @var string $title</span>
<span class="pl-c">     * @Assert\NotBlank(message="title.blank", groups={"group1", "group2"});</span>
<span class="pl-c">     */</span>
    <span class="pl-k">private</span> <span class="pl-c1"><span class="pl-c1">$</span>title</span>;

    <span class="pl-c">/**</span>
<span class="pl-c">     * @var Project\AuthenticationBundle\Entity\User</span>
<span class="pl-c">     * @Assert\Valid(groups={"group2"});</span>
<span class="pl-c">     */</span>
    <span class="pl-k">private</span> <span class="pl-c1"><span class="pl-c1">$</span>user</span>;</pre></div>
<p dir="auto">Calling <code class="notranslate">$this-&gt;get('validator')-&gt;validate($userProduct, array('group1'))</code> asserts the class constraint (<code class="notranslate">@Assert\Callback</code>) and the <code class="notranslate">$title</code> property but also the <code class="notranslate">$user</code> one too, even though it's not included in the validation group. The same happens if no groups are passed to the <code class="notranslate">Valid</code> constraint.</p>
<p dir="auto">Removing the <code class="notranslate">@Assert\Valid()</code> constraint and running the same validation again for <code class="notranslate">group1</code> does not assert the <code class="notranslate">$user</code> property, as expected.</p>
<p dir="auto">The <code class="notranslate">MemberMetadata</code> class appears to always force the cascading of the <code class="notranslate">Valid</code> constraint, although I'm unsure if this is exactly related to the issue I'm experiencing.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="// Symfony\Component\Validator\Mapping\MemberMetadata.php
        if ($constraint instanceof Valid) {
            $this-&gt;cascaded = true;
            $this-&gt;collectionCascaded = $constraint-&gt;traverse;
        } else {
            parent::addConstraint($constraint);
        }"><pre class="notranslate"><code class="notranslate">// Symfony\Component\Validator\Mapping\MemberMetadata.php
        if ($constraint instanceof Valid) {
            $this-&gt;cascaded = true;
            $this-&gt;collectionCascaded = $constraint-&gt;traverse;
        } else {
            parent::addConstraint($constraint);
        }
</code></pre></div>
<p dir="auto">Running on Symfony2 master.</p>