Documentação do Symfony2
Renderizada do repositório symfony-docs-pt-BR no Github

Como Lidar com Diferentes Níveis de Erro

Às vezes, você pode querer exibir mensagens de erro da contraint de validação de forma diferente com base em algumas regras. Por exemplo, você tem um formulário de inscrição para novos usuários onde eles informam alguns dados pessoais e escolhem suas credenciais de autenticação. Eles terão de escolher um nome de usuário e uma senha segura, mas fornecer as informações da conta bancária será opcional. No entanto, você quer ter certeza de que esses campos opcionais, se informados, são válidos, porém exibir seus erros de forma diferente.

O processo para atingir esse comportamento consiste de dois passos:

  1. Aplicar diferentes níveis de erro para as constraints de validação;
  2. Personalizar suas mensagens de erro, dependendo do nível de erro configurado.

1. Atribuir o nível de erro

New in version 2.6: A opção `` payload`` foi introduzida no Symfony 2.6.

Use a opção payload para configurar o nível de erro para cada constraint:

2. Personalizar o Template de Mensagem de Erro

New in version 2.6: O método getConstraint() na classe ConstraintViolation foi introduzido no Symfony 2.6.

Quando a validação do objeto User falhar, você pode recuperar a constraint que causou uma falha em particular usando o método :method:`Symfony\\Component\\Validator\\ConstraintViolation::getConstraint` . Cada constraint expõe o payload anexado como uma propriedade pública:

// a constraint validation failure, instance of
// Symfony\Component\Validator\ConstraintViolation
$constraintViolation = ...;
$constraint = $constraintViolation->getConstraint();
$severity = isset($constraint->payload['severity']) ? $constraint->payload['severity'] : null;

Por exemplo, você pode aproveitar isso para personalizar o bloco form_errors de modo que severity é adicionada como uma classe HTML adicional:

{%- block form_errors -%}
    {%- if errors|length > 0 -%}
    <ul>
        {%- for error in errors -%}
            {% if error.cause.constraint.payload.severity is defined %}
                {% set severity = error.cause.constraint.payload.severity %}
            {% endif %}
            <li{% if severity is defined %} class="{{ severity }}"{% endif %}>{{ error.message }}</li>
        {%- endfor -%}
    </ul>
    {%- endif -%}
{%- endblock form_errors -%}

See also

Para obter mais informações sobre como personalizar a renderização do formulário, consulte Como personalizar a Renderização de Formulários.