tobias/zend-validator-doctrine

此软件包已被废弃且不再维护。没有建议的替代软件包。

使用 Zend\Validator 验证 doctrine 实体

dev-master 2019-06-27 12:36 UTC

This package is auto-updated.

Last update: 2020-02-01 19:22:39 UTC


README

Build Status

受著名的 DoctrineModule 启发并基于此。

此软件包提供了三个开箱即用的验证器: Tobias\Zend\Validator\Doctrine\ObjectExistsTobias\Zend\Validator\Doctrine\NoObjectExists 分别实现了检查实体是否存在于数据库中的功能,以及 Tobias\Zend\Validator\Doctrine\UniqueObject 实现了检查值是否只在一个对象中使用的功能。它们的行为与其他任何标准 Zend 验证器类似。

所有三个验证器都接受以下选项

  • object_repository : 对象存储库的实例。
  • fields : 包含用于检查实体是否存在(或不存在)的所有字段的数组。

Tobias\Zend\Validator\Doctrine\UniqueObject 还需要以下选项

  • object_manager : 对象管理器的实例。

关于 use_context 选项和其他关于 Tobias\Zend\Validator\Doctrine\UniqueObject 的具体信息,请参阅以下内容

提示:要从对象管理器获取对象存储库,您需要调用任何有效对象管理器实例的 getRepository 函数,传入类的完全限定名称(FQCN)。例如,在 Doctrine 2 ORM 的上下文中,以下是获取 'Application\Entity\User' 实体的 object_repository 的方法

$repository = $entityManager->getRepository('Application\Entity\User');

简单用法

您可以通过以下方式直接实例化验证器

$validator = new \Tobias\Zend\Validator\Doctrine\ObjectExists([
    'object_repository' => $objectManager->getRepository('Application\Entity\User'),
    'fields' => ['email'],
]);

var_dump($validator->isValid('test@example.com')); // dumps 'true' if an entity matches
var_dump($validator->isValid(['email' => 'test@example.com'])); // dumps 'true' if an entity matches

与 Zend Framework 2 表单一起使用

当然,验证器与表单配合使用特别有用。要将 NoObjectExists 验证器添加到 Zend Framework 表单元素中

namespace Application\Form;

use Tobias\Zend\Validator\Doctrine\NoObjectExists as NoObjectExistsValidator;
use Zend\Form\Form;
use Zend\ServiceManager\ServiceManager;
use Application\Entity;

class User extends Form
{
    public function __construct(ServiceManager $serviceManager)
    {
        parent::__construct('my-form');

        // Add an element
        $this->add([
            'type'    => 'Zend\Form\Element\Email',
            'name'    => 'email',
            'options' => [
                'label' => 'Email',
            ],
            'attributes' => [
                'required' => 'required',
            ],
        ]);

        // add other elements (submit, CSRF…)

        // Fetch any valid object manager from the Service manager
        $entityManager = $serviceManager->get('doctrine.entitymanager.orm_default');

        // Now get the input filter of the form, and add the validator to the email input
        $emailInput = $this->getInputFilter()->get('email');

        $noObjectExistsValidator = new NoObjectExistsValidator([
            'object_repository' => $entityManager->getRepository(Entity\User::class),
            'fields'            => 'email',
        ]);

        $emailInput
            ->getValidatorChain()
            ->attach($noObjectExistsValidator);
    }
}

如果您使用字段集,可以直接使用数组表示法添加验证器。例如,在 getInputFilterSpecification 函数中,如下所示

namespace Application\Form;

use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\ServiceManager\ServiceManager;
use Application\Entity;

class UserFieldset extends Fieldset implements InputFilterProviderInterface
{
    protected $serviceManager;

    public function __construct(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;

        parent::__construct('my-fieldset');

        // Add an element
        $this->add([
            'type'    => 'Zend\Form\Element\Email',
            'name'    => 'email',
            'options' => [
                'label' => 'Email',
            ],
            'attributes' => [
                'required' => 'required',
            ],
        ]);
    }

    public function getInputFilterSpecification()
    {
        $entityManager = $this->serviceManager->get('doctrine.entitymanager.orm_default');

        return [
            'email' => [
                'validators' => [
                    [
                        'name' => 'Tobias\Zend\Validator\Doctrine\NoObjectExists',
                        'options' => [
                            'object_repository' => $entityManager->getRepository(Entity\User::class),
                            'fields' => 'email',
                        ],
                    ],
                ],
            ],
        ];
    }
}

您可以通过以下方式更改验证器的默认消息

// For NoObjectExists validator (using array notation) :
'validators' => [
    [
        'name' => 'Tobias\Zend\Validator\Doctrine\NoObjectExists',
        'options' => [
            'object_repository' => $this->getEntityManager()->getRepository('Application\Entity\User'),
            'fields' => 'email',
            'messages' => [
                'objectFound' => 'A user with this email already exists.',
            ],
        ],
    ],
],

// For ObjectExists validator (using object notation) :
$objectExistsValidator = new \Tobias\Zend\Validator\Doctrine\ObjectExists([
    'object_repository' => $entityManager->getRepository('Application\Entity\User'),
    'fields'            => 'email',
]);

**$objectExistsValidator->setMessage('noObjectFound', 'Email was not found.');**

UniqueObject

使用 Tobias\Zend\Validator\Doctrine\UniqueObject 时,您需要考虑两个问题;如上所述,您必须将 ObjectManager 作为 object_manager 选项传递,其次您必须为实体中具有的每个标识符传递一个值。

  • 如果您省略了 use_context 选项或将它设置为 false,您必须将包含 fieldsidentifier 值的数组传递给 isValid()。当使用 Zend\Form 时,如果您使用字段集,则需要此行为。
  • 如果您将 use_context 选项设置为 true,您必须将 fields 值作为第一个参数传递,并将包含 identifier 值的数组作为第二个参数传递给 isValid()。当在不使用字段集的情况下使用 Zend\Form 时,则需要此行为。

重要:无论您选择哪种方式,请确保 identifier 值的命名方式是字段名,而不是数据库列名。