有時(shí)候,您想通過某些規(guī)則和標(biāo)準(zhǔn)來定義并且展示不同的限制驗(yàn)證錯(cuò)誤。比如,您建立了一個(gè)給用戶進(jìn)行注冊(cè)的表單,用戶需要輸入身份信息和用戶憑據(jù)來完成注冊(cè)。當(dāng)用戶進(jìn)行注冊(cè)的時(shí)候,輸入用戶名和一個(gè)安全的密碼是必不可少的,但是是否輸入用戶的銀行賬戶信息并不是強(qiáng)制要求的,用戶具有選擇權(quán)。盡管如此,如果用戶在該字段輸入了信息,那么您還是需要檢查用戶在該字段的輸入的信息是否是正確有效的,如果輸入出現(xiàn)錯(cuò)誤,您就得給出不同的錯(cuò)誤描述。
實(shí)現(xiàn)該功能一共需要兩個(gè)步驟:
2.6 在 Symfony 2.6節(jié)中介紹了 payload 選項(xiàng)。
使用 payload 選項(xiàng)來配置每個(gè)約束的級(jí)別:
Annotations:
// 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;
}
YAML:
# 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
XML:
<!-- 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>
PHP:
// 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'),
)));
}
}
2.6 在 Symfony 2.6節(jié)中的 ConstraintViolation 類中介紹了 getConstraint() 方法。
當(dāng)用戶輸入的對(duì)象在檢驗(yàn)時(shí)失敗,這時(shí)候就可以通過使用 [getConstraint()](http://api.symfony.com/2.7/Symfony/Component/Validator/ConstraintViolation.html#getConstraint()) 方法來檢索造成失敗的限制。每個(gè)限制都會(huì)把 payload 選項(xiàng)作為一個(gè)公開屬性進(jìn)行展示。
// a constraint validation failure, instance of
// Symfony\Component\Validator\ConstraintViolation
$constraintViolation = ...;
$constraint = $constraintViolation->getConstraint();
$severity = isset($constraint->payload['severity']) ? $constraint->payload['severity'] : null;
例如,您可以利用這個(gè)功能把錯(cuò)誤級(jí)別作為一個(gè) HTML 類的一個(gè)附加項(xiàng)添加到表單的錯(cuò)誤區(qū)域:
{%- 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 -%}