Symfony数据校验方法实例分析(5)

class Author
{
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addGetterConstraint('passwordLegal', new True(array(
            'message' => 'The password cannot match your first name',
        )));
    }
}

现在我们创建一个isPasswordLegal()方法,并且包含你需要逻辑:

复制代码 代码如下:

public function isPasswordLegal()
{
   return ($this->firstName != $this->password);
}


眼尖的人可能会注意到getter的前缀("get"或者"is")在映射时被忽略了。这允许你在不改变校验规则的前提下,把一个约束移动到一个具有同名属性上,反之亦然。

类:

一些约束应用到整个类被校验上面。比如,Callback约束是一个通用约束,它可以应用到类自身。当类被校验时,被约束描述的方法只是被执行这样每一个可以提供更个性化的校验。

校验分组

到目前为止,你已经能够添加约束到类并询问是否该类传入所有定义的约束规则。一些情况下,你只需要使用该类的其中某些规则来校验一个对象。要做到这些,你可以组织每一个约束到一个或者多个校验组中,然后应用使用其中一组校验。比如,假设你有一个User类,它会在用户注册和用户更新他们的联系信息时使用。

YAML格式:

复制代码 代码如下:

# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\User:
    properties:
        email:
            - Email: { groups: [registration] }
        password:
            - NotBlank: { groups: [registration] }
            - MinLength: { limit: 7, groups: [registration] }
        city:
            - MinLength: 2

类声明格式:

复制代码 代码如下:

// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;

class User implements UserInterface
{
    /**
    * @Assert\Email(groups={"registration"})
    */
    private $email;

/**
    * @Assert\NotBlank(groups={"registration"})
    * @Assert\MinLength(limit=7, groups={"registration"})
    */
    private $password;

/**
    * @Assert\MinLength(2)
    */
    private $city;
}

XML格式:

复制代码 代码如下:

<!-- src/Acme/BlogBundle/Resources/config/validation.xml -->
<class>
    <property>
        <constraint>
            <option>
                <value>registration</value>
            </option>
        </constraint>
    </property>
    <property>
        <constraint>
            <option>
                <value>registration</value>
            </option>
        </constraint>
        <constraint>
            <option>7</option>
            <option>
                <value>registration</value>
            </option>
        </constraint>
    </property>
    <property>
        <constraint>7</constraint>
    </property>
</class>

PHP代码格式:

复制代码 代码如下:

// src/Acme/BlogBundle/Entity/User.php
namespace Acme\BlogBundle\Entity;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8cc28a531e1f69845a26ca55b26ed69c.html