使用Symfony Validator验证Doctrine实体

时间:2015-02-21 02:25:08

标签: php validation symfony doctrine

我很难将Symfony验证器组件与Doctrine集成(独立,不使用完整的Symfony框架)。到目前为止,我已经设法在Doctrine的AnnotationRegistry中注册注释约束并挂钩生命周期回调,但是我如何实际检索验证器并解析生命周期方法中的注释?

我的实体看起来像这样:

<?php
namespace App\Model;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User
 *
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"}), @ORM\UniqueConstraint(name="username_UNIQUE", columns={"username"})})
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User extends AbstractEntity
{
    /**
     * @ORM\PreUpdate
     * @ORM\PrePersist
     */
    public function validate()
    {
        // how do I retrieve the validator?

        // $validator->validate($this);
    }

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=45, nullable=false)
     * @Assert\Length(min=3, max=45)
     */
    protected $username;

    /** ... */
}

1 个答案:

答案 0 :(得分:5)

由于您没有使用symfony fullstack,您应该手动创建验证器服务以使用它。

请参阅Usage Section of Validator component readme

use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Constraints as Assert;

class User
{
    /**
     * @Assert\Length(min = 3)
     * @Assert\NotBlank
     */
    private $name;

    /**
     * @Assert\Email
     * @Assert\NotBlank
     */
    private $email;

    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * @Assert\True(message = "The user should have a Google Mail account")
     */
    public function isGmailUser()
    {
        return false !== strpos($this->email, '@gmail.com');
    }
}

验证器

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->getValidator();

$user = new User('John Doe', 'john@example.com');

$violations = $validator->validate($user);