Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github
À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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // src/AppBundle/Entity/User.php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
/**
* @Assert\NotBlank(payload = {severity = "error"})
*/
protected $username;
/**
* @Assert\NotBlank(payload = {severity = "error"})
*/
protected $password;
/**
* @Assert\Iban(payload = {severity = "warning"})
*/
protected $bankAccountNumber;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # src/AppBundle/Resources/config/validation.yml
AppBundle\Entity\User:
properties:
username:
- NotBlank:
payload:
severity: error
password:
- NotBlank:
payload:
severity: error
bankAccountNumber:
- Iban:
payload:
severity: warning
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <!-- src/AppBundle/Resources/config/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
<class name="AppBundle\Entity\User">
<property name="username">
<constraint name="NotBlank">
<option name="payload">
<value key="severity">error</value>
</option>
</constraint>
</property>
<property name="password">
<constraint name="NotBlank">
<option name="payload">
<value key="severity">error</value>
</option>
</constraint>
</property>
<property name="bankAccountNumber">
<constraint name="Iban">
<option name="payload">
<value key="severity">warning</value>
</option>
</constraint>
</property>
</class>
</constraint-mapping>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // src/AppBundle/Entity/User.php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('username', new Assert\NotBlank(array(
'payload' => array('severity' => 'error'),
)));
$metadata->addPropertyConstraint('password', new Assert\NotBlank(array(
'payload' => array('severity' => 'error'),
)));
$metadata->addPropertyConstraint('bankAccountNumber', new Assert\Iban(array(
'payload' => array('severity' => 'warning'),
)));
}
}
|
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 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:
1 2 3 4 5 6 7 8 9 10 11 12 | {%- 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 /cookbook/form/form_customization.